Hi, I have two tables, and I want to join them based on some priority rules:
If some special values exist in the joined subset, join all of those values, otherwise join the first occurence of some other special value, if that value also does not exist, join the first occurence of a third value, and if that value also does not exist, join the first occurence of any value. # create test tables create table a (aid int,name char(10)); create table b (bid int,aid int,code char(1)); # insert dummy data insert into a values (1,'rec 1'),(2,'rec 2'),(3,'rec 3'),(4,'rec 4'); insert into b values (1,1,'A'),(2,1,'B'),(3,1,'C'),(4,1,'D'),(5,1,'E'); insert into b values (6,2,'C'),(7,2,'C'),(8,2,'D'),(9,2,'E'); insert into b values (10,3,'D'),(11,3,'D'),(12,3,'E'); insert into b values (13,4,'E'),(14,4,'E'),(15,4,'F'); # listing all combinations select a.aid,a.name,b.bid,b.code from a,b where b.aid=a.aid order by a.aid,b.code; +------+-------+------+------+ | aid | name | bid | code | +------+-------+------+------+ | 1 | rec 1 | 1 | A | | 1 | rec 1 | 2 | B | | 1 | rec 1 | 3 | C | | 1 | rec 1 | 4 | D | | 1 | rec 1 | 5 | E | | 2 | rec 2 | 6 | C | | 2 | rec 2 | 7 | C | | 2 | rec 2 | 8 | D | | 2 | rec 2 | 9 | E | | 3 | rec 3 | 10 | D | | 3 | rec 3 | 11 | D | | 3 | rec 3 | 12 | E | | 4 | rec 4 | 13 | E | | 4 | rec 4 | 14 | E | | 4 | rec 4 | 15 | F | +------+-------+------+------+ # priority rules: # if codes A or B exist in b: show _all_ of _both_ # otherwise, show _first_ C if it exist # otherwise, show _first_ D if it exist # otherwise, show _first_ existing code In the test data, each of these four rules apply to the corresponding record in table a: record 1 match rule 1, record 2 match rule 2 and so on. # What we want is this: +------+-------+------+------+ | aid | name | bid | code | +------+-------+------+------+ | 1 | rec 1 | 1 | A | | 1 | rec 1 | 2 | B | | 2 | rec 2 | 6 | C | | 3 | rec 3 | 10 | D | | 4 | rec 4 | 13 | E | +------+-------+------+------+ What I've got so far, is this: select distinct a.aid,a.name,b.bid,b.code from a,b left join b as pri1 on pri1.aid=a.aid and pri1.code in('A','B') left join b as pri2 on pri2.aid=a.aid and pri2.code in('C') left join b as pri2b on pri2b.aid=a.aid and pri2b.code in('C') and pri2b.bid < b.bid left join b as pri3 on pri3.aid=a.aid and pri3.code in('D') left join b as pri3b on pri3b.aid=a.aid and pri3b.code in('D') and pri3b.bid < b.bid left join b as pri4 on pri4.aid=a.aid and pri4.code = b.code left join b as pri4b on pri4b.aid=a.aid and pri4b.bid < b.bid where b.aid=a.aid and ( (not ISNULL(pri1.bid) and b.code=pri1.code) or (ISNULL(pri1.bid) and not ISNULL(pri2.bid) and ISNULL(pri2b.bid) and b.code=pri2.code) or (ISNULL(pri1.bid) and ISNULL(pri2.bid) and not ISNULL(pri3.bid) and ISNULL(pri3b.bid) and b.code=pri3.code) or (ISNULL(pri1.bid) and ISNULL(pri2.bid) and ISNULL(pri3.bid) and not ISNULL(pri4.bid) and ISNULL(pri4b.bid)) ) order by a.aid,b.code; This query works, but is there an easier way? (version 3.23.39 on solaris) TIA, Roger Baklund, Mobiliant AS --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php