喜悦国际村 » 数据库技术 » SQL联接问题

页: [1]
thankcup2007-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的记录信息,
大家也要想一下吧。

seakingx2007-3-20 08:59 AM
搞个测试的脚本吧 ...
或者数据的例子

thankcup2007-3-20 09:00 AM
对了,取数据时A表中也要加一个条件,age <XX

thankcup2007-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]]

seakingx2007-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]

seakingx2007-3-20 09:25 AM
我想应该需要子查询, 第一次先把left联合查出, 然后在加条件,否则如果用 status='primary'  作为条件,如果B不存在对应的记录, status 为NULL,就会去掉了, 所以需要用子查询才能完成。

以上脚本在mysql 5.0 win 测试成功。

thankcup2007-3-20 09:33 AM
恩,很好。思路很清晰,谢谢,不过是不是先选择再联接好一点,就是把那个age <24放在里面

seakingx2007-3-20 09:35 AM
对, 这样效率会高些

thankcup2007-3-20 10:02 AM
服务器版本太低了3.23.58 ,唉

thankcup2007-3-20 10:46 AM
好像还是有点问题,如果B表中有两条a_id相同的记录,其中一条的status是primary,那两条都取出来了

seakingx2007-3-20 11:33 AM
另一个status 是NULL吗?
如果是NULL , 我想应该在设计B的时候,把status 的default = ""

thankcup2007-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
    -> ;

seakingx2007-3-21 02:27 AM
如果age<40 的范围比 status ='primary' 的范围小, 把age<40 放在 前面, 查询效率会高些。
这么做的原因可以参考我发过的一个帖子
[url]http://www.phpx.com/happy/thread-131815-1-1.html[/url]


查看完整版本: SQL联接问题


Powered by Discuz! Archiver 6.1.0  © 2001-2006 Comsenz Inc.
Processed in 0.128268 second(s), 2 queries