页:
[1]
| thankcup | 2007-3-20 08:38 AM |
|
SQL联接问题
有两个表 A(a_id,age,name)
B(b_id,a_id,photo,status) 其中a_id对应A表中的a_id
在B表中一个a_id可以存在于多条记录中,但status为primary的a_id只有一个
现在需要取出所有a_id在A表中的所有信息,和在B表中status为primary的记录信息,
大家也要想一下吧。 |
| seakingx | 2007-3-20 08:59 AM |
|
搞个测试的脚本吧 ...
或者数据的例子 |
| thankcup | 2007-3-20 09:00 AM |
|
| 对了,取数据时A表中也要加一个条件,age <XX |
| thankcup | 2007-3-20 09:08 AM |
|
大概就是这样的
SELECT A.*, B.photo FROM A left join B ON A.a_id=B.a_id WHERE A.age<24 AND B.status='primary",但这样是不行,因为这样的话,如果B表中没有符合status为primary的记录那A表中也取不出age小于24的信息了,现在是想要在B表中没有符合status为primary的情况下也可以取出A表中的信息,
[[i] 本帖最后由 thankcup 于 2007-3-20 05:11 PM 编辑 [/i]] |
| seakingx | 2007-3-20 09:22 AM |
|
[font=Courier New]mysql> select * from testa;
+------+------+----------+
| a_id | age | name |
+------+------+----------+
| 1 | 20 | cup |
| 2 | 22 | think |
| 3 | 31 | seakingx |
+------+------+----------+
3 rows in set (0.01 sec)
mysql> select * from testb;
+------+------+-------+---------+
| b_id | a_id | photo | status |
+------+------+-------+---------+
| 101 | 1 | pp1 | primary |
| 102 | 1 | pp2 | primary |
| 103 | 1 | pp3 | aaa |
| 201 | 2 | pp1 | primary |
| 202 | 2 | pp2 | bbb |
| 203 | 2 | pp3 | ccc |
+------+------+-------+---------+
6 rows in set (0.00 sec)
mysql> select C.* from (
-> select A.* , B.photo,B.status from testa A left join testb B on A.a_id = B.a_id) C
-> where (C.status='primary' OR C.status is NULL)
-> AND C.age < 40
-> ;
+------+------+----------+-------+---------+
| a_id | age | name | photo | status |
+------+------+----------+-------+---------+
| 1 | 20 | cup | pp1 | primary |
| 1 | 20 | cup | pp2 | primary |
| 2 | 22 | think | pp1 | primary |
| 3 | 31 | seakingx | NULL | NULL |
+------+------+----------+-------+---------+
4 rows in set (0.00 sec)[/font] |
| seakingx | 2007-3-20 09:25 AM |
|
我想应该需要子查询, 第一次先把left联合查出, 然后在加条件,否则如果用 status='primary' 作为条件,如果B不存在对应的记录, status 为NULL,就会去掉了, 所以需要用子查询才能完成。
以上脚本在mysql 5.0 win 测试成功。 |
| thankcup | 2007-3-20 09:33 AM |
|
| 恩,很好。思路很清晰,谢谢,不过是不是先选择再联接好一点,就是把那个age <24放在里面 |
| seakingx | 2007-3-20 09:35 AM |
|
| 对, 这样效率会高些 |
| thankcup | 2007-3-20 10:02 AM |
|
| 服务器版本太低了3.23.58 ,唉 |
| thankcup | 2007-3-20 10:46 AM |
|
| 好像还是有点问题,如果B表中有两条a_id相同的记录,其中一条的status是primary,那两条都取出来了 |
| seakingx | 2007-3-20 11:33 AM |
|
另一个status 是NULL吗?
如果是NULL , 我想应该在设计B的时候,把status 的default = "" |
| thankcup | 2007-3-21 12:54 AM |
|
兄弟,谢谢,现在可以了,我把外面的一层select语句去掉了也行的,就是这样
mysql> select A.* , B.photo,B.status from testa A left join testb B on A.a_id = B.a_id
-> where (B.status='primary' OR B.status is NULL)
-> AND A.age < 40
-> ; |
| seakingx | 2007-3-21 02:27 AM |
|
如果age<40 的范围比 status ='primary' 的范围小, 把age<40 放在 前面, 查询效率会高些。
这么做的原因可以参考我发过的一个帖子
[url]http://www.phpx.com/happy/thread-131815-1-1.html[/url] |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.128268 second(s), 2 queries |