On Tue, Feb 12, 2002 at 01:31:43PM -0000, DL Neil wrote: | Hello Nuno, | | > I'm trying to make a query with only one command but I can't see how to do | > it. | > | > Supose that are 2 tables like: | > | > table QA table QB | > ref text ref text | > --- ---- --- ---- | > a1 texta1 b1 textb1 | > a2 texta2 b2 textb2 | > a3 texta3 b3 textb3 | > | > and there is a table that indicates the relation between QB and QA data: | > | > table relAB | > A B | > -- -- | > a1 b2 | > a1 b3 | > a1 b4 | > a2 b1 | > a2 b2 | > | > This example says that b2,b3,b4 are related to a1 and b1,b2 are | > related to a2. | > | > What I want to do is get a list from table QB related to an item from | > table QA: | > | > For example, get a list from QB related to item 'a1': | > | > 1. select B from relAB where A='a1'; | > | > (result: b2, b3, b4) | > | > 2. select * from QB where ref in ('b2','b3','b4'); | > | > (result: only 'a1' related items) | > | > There is a way of make this query with only one command? | > | > Something like: | > | > 1. select * from QB where ref in (select B from relAB where A='a1'); | | | The technique you describe is called a "join", ie joining two tables together, and |yes, you can have more than | one join in a single SQL query. | | So starting with (1) let's join tables RelAB and QA by informing MySQL that we want |to match the row in table QA | with the corresponding row(s) in RelAB | | select A, B from relAB, QA where QA.ref='a1' AND QA.ref=A; | | (notice that I added "A" to the SELECT clause, which we know from the WHERE clause |will be 'a1', but I assume | that once you have the query working that query-value change from time-to-time. Also |I moved the relationship | between the constant ('a1') and the source-table. If the tblNm.colNm notation is |unfamiliar, please check the | manual - it is necessary because the term "ref" is ambiguous/could refer to either |tbl QA or tbl QB) | | Similarly with (2) we can extend your code to join tables RelAB and WB | | select * from QB where QB.ref in ('b2','b3','b4') AND B=QB.ref; | | NB let's treat this as pseudo-code that only looks like SQL! | | Of course you found the 'b2','b3','b4' series by executing query (1), so let's now |put the two queries | together - just as you knew they should be: | | select A, QB.* from QB, relAB, QA | where QA.ref='a1' | AND QA.ref=A | AND B=QB.ref; | | Now that you know the terminology, you will be able to find helpful tutorials on the |various supporting web | sites - start with MySQL's site. | | BTW: I followed your sequence of queries to construct the joined-query. Perhaps it's |just me, but I normally | start at the 'end' and work 'back' to the 'beginning' - so I'd start with what I |wanted out of QB, work back to | 'how to get it from relAB' and thence right back to QA. I find it easier to |'visualise', but then other people | aren't (quite) this crazy! | | Regards, | =dn
Hi, Ok. I start understand this better and what I need is working very well now. I think I've posted this doubt because I made some confusion about "linking" or relating diferent tables like in this example. Now I know that with JOIN I can create relations between diferent tables and then maintain a good database structure by having things separated from each other. Thanks again for you help, -- Nuno Teixeira pt-quorum.com /* PGP Public Key: http://www.pt-quorum.com/pgp/nunoteixeira.asc Key fingerprint: 8C2C B364 D4DC 0C92 56F5 CE6F 8F07 720A 63A0 4FC7 */ --------------------------------------------------------------------- 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