wow! that's known as "above and beyond the call of duty". hope the newbies appreciate your work.
> Here's a mini-tutorial on left join that should solve your problem. > > First, let's make a smaller example. (It would have been helpful if > you had done that and formatted your select so it could be read when > you posted the question ;-) Here are 2 tables: > > select * from header; select * from placement; > +------+ +------+-----------+ > | code | | code | product | > +------+ +------+-----------+ > | 6 | | 6 | NOSUCH | > | 7 | | 7 | OVRLCKBDG | > | 8 | | 7 | FUBAR | > +------+ +------+-----------+ > > You want: > Info for header 6, and, if any, info for placement (6, '1029106') > Info for header 7, and, if any, info for placement (7, 'OVRLCKBDG') > > Let's look at what a left join is. For a SQL query, > select A.*, B.* from A left join B on <condition>; > returns two things, > (1) Matching rows from A and B, as would be returned by > SELECT A.*, B.* from A, B where <condition>; > (2) Rows of the form A.*, null, ..., null where those rows > in A are included that do NOT participate in the match > in (1), followed by nulls representing the columns of B. > > So, in our example, > > select header.*, placement.* > from header > left join placement > on header.code = placement.code; > > gives us all of the header codes and the matching placements: > +------+------+-----------+ > | code | code | product | > +------+------+-----------+ > | 6 | 6 | NOSUCH | > | 7 | 7 | OVRLCKBDG | > | 7 | 7 | FUBAR | > | 8 | NULL | NULL | > +------+------+-----------+ > > Well, we don't want all of the matching placements; we just want the > specific matches listed above. So, let's add these to the left > join condition: > > select header.*, placement.* > from header > left join placement > on header.code = placement.code > and ( header.code = 6 and placement.product = '1029106' > or header.code = 7 and placement.product = 'OVRLCKBDG' ); > > This gives us the placements we want, but there are too many headers: > +------+------+-----------+ > | code | code | product | > +------+------+-----------+ > | 6 | NULL | NULL | > | 7 | 7 | OVRLCKBDG | > | 8 | NULL | NULL | > +------+------+-----------+ > > So. finally, we get rid of the extra headers by adding a where clause: > > select header.*, placement.* > from header > left join placement > on header.code = placement.code > and ( header.code = 6 and placement.product = '1029106' > or header.code = 7 and placement.product = 'OVRLCKBDG' ) > where header.code in (6, 7); > > This gives the desired result: > +------+------+-----------+ > | code | code | product | > +------+------+-----------+ > | 6 | NULL | NULL | > | 7 | 7 | OVRLCKBDG | > +------+------+-----------+ > > > ==================== > > This is a bit ugly, in that the header.code's are listed twice, and there > are a lot of literals in the select statement. It might be better to > use a temporary table to hold the desired (code, product) pairs. Then, > we join the 3 tables with a select that seems less complex: > > Here's the temporary table: > > select * from tt; > +------+-----------+ > | code | product | > +------+-----------+ > | 6 | 1029106 | > | 7 | OVRLCKBDG | > +------+-----------+ > > and here's the 3-table join: > > select header.*, placement.* > from header > inner join tt > on header.code = tt.code > left join placement > on tt.code = placement.code > and tt.product = placement.product; > > which also gives the desired result: > +------+------+-----------+ > | code | code | product | > +------+------+-----------+ > | 6 | NULL | NULL | > | 7 | 7 | OVRLCKBDG | > +------+------+-----------+ > > > From: "Mark Colvin" <[EMAIL PROTECTED]> > > To: "MySQL Mailing List \(E-mail\)" <[EMAIL PROTECTED]> > > Subject: MySQL Left Join Query > > Date: Mon, 18 Nov 2002 08:05:51 -0000 > > > > I have a two table query where I want to return records from the first > table > > and if they have corresponding details in my second table I wish to return > > those as well. A sample sql statement I am using is as follows: > > > > select decheader.code, decheader.height, decheader.width, > > decplacement.position, decplacement.product from decheader left join > > decplacement on decheader.code = decplacement.code where (decheader.code = > > '00007' and decplacement.product = 'OVRLCKBDG') or (decheader.code = > '00006' > > and decplacement.product = '1029106') or (decheader.code = '00005' and > > decplacement.product = '1029103') or (decheader.code = '00005' and > > decplacement.product = '1029104') or (decheader.code = '00005' and > > decplacement.product = '1029105') or (decheader.code = '00005' and > > decplacement.product = '1029106') or (decheader.code = '00004' and > > decplacement.product = '1029104') or (decheader.code = '00004' and > > decplacement.product = '1029105') > > > > In the above example, all of the codes exist in the decheader table but > only > > code 00007 has a corresponding product in the decplacement table. I would > > wish to return all the decheader details for the above codes and the > > decplacement details for code 00007 as well. This statement actually only > > gives me the details for code 0007 and nothing else. I should add that for > > each record in the decheader table, there may be one, none or many > recordsh > > in the decplacement table but I will only be interested in a specific one. > I > > hope this makes some sort of sense!! > > > -- John Ragan [EMAIL PROTECTED] http://www.CoreReader.com/ --------------------------------------------------------------------- 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