西西河

主题:【求助】mysql中2个表2个条件怎么写来做选择? -- 铁手

共:💬22 🌺13 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 【求助】mysql中2个表2个条件怎么写来做选择?

标题不够写。

具体是这样的:两个表 A 有字段(aa,bb,dd),表 B 有字段 (aa,cc)。最终的目的是从表A中选择合适的内容。选择的条件有两个,一是 A.aa=常量,二是 B.cc 是常量,并且 A.aa=B.aa。

如果是单独的把这两个条件列出来,就是:

SELECT aa,bb,dd FROM A WHERE aa=12345

SELECT A.aa,A.bb,A.dd FROM A,B WHERE B.cc=23456 AND A.aa=B.aa

有没有办法放到一个语句里来实现?

SELECT A.aa,A.bb,A.dd FROM A,B WHERE (B.cc=23456 AND A.aa=B.aa) OR A.aa=12345

返回为空。

SELECT A.aa,A.bb,A.dd FROM A LEFT JOIN B ON ((B.cc=23456 AND A.aa=B.aa) OR A.aa=12345)

则无选择返回全部

不知道谁有好办法?

家园 why not use union?
家园 试一下这个:

SELECT A.aa,A.bb,A.dd

FROM A LEFT JOIN B ON A.aa=B.aa

WHERE B.cc=23456 OR A.aa=12345

家园 Try "INNER JOIN"

replace "LEFT JOIN" by "INNER JOIN"

SELECT <column_name1>, <column_name2> FROM <tbl_name> INNER JOIN <tbl_name> ON <join_conditions>

家园 Try &quot;INNER JOIN&quot;

replace "LEFT JOIN" by "INNER JOIN".

SELECT <column_name1>, <column_name2> FROM <tbl_name> INNER JOIN <tbl_name> ON <join_conditions>.

试一下吧,我这里没有mysql,没法试。

家园 这样试一下

SELECT A.aa,A.bb,A.dd FROM A LEFT JOIN B on (A.aa=B.aa) where A.aa=1234 OR B.cc=23456

家园 试试?

SELECT A.aa,A.bb,A.dd FROM A,B WHERE A.aa=B.aa AND A.aa=12345 AND B.cc=23456

家园 RE:

SELECT A.aa,A.bb,A.dd FROM A LEFT JOIN B ON (A.aa=B.aa) WHERE B.cc=23456 OR A.aa=12345

家园 A.aa 都已经是常量了,还要求A.aa=B.aa ?

A.aa 都已经是常量了,为什么还要求A.aa=B.aa ?

家园 你用的数据库版本语句支持 sql 的 in 关键字吗

SELECT A.aa,A.bb,A.dd

FROM A

WHERE A.aa=12345 and A.aa IN (SELECT B.aa FROM B WHERE B.cc=23456 )

家园 ME TRY TOO

SELECT aa,bb,dd FROM A WHERE aa=12345

SELECT A.aa,A.bb,A.dd FROM A,B WHERE B.cc=23456 AND A.aa=B.aa

目的是把A表里aa字段为12345的数据取出来,另外,还想把A表里那些其aa字段的值在B表里相对应的cc字段的值为23456的数据取出来吧。

B表aa是PRIMARY KEY吗?另外,是A表aa字段的FOREIGN KEY吗?

如果这样,ORACLE和SQL SERVER里面,这样应该就可以。

SELECT A.aa,A.bb,A.dd FROM A INNER JOIN B ON ((B.cc=23456 AND A.aa=B.aa) OR A.aa=12345)

如果是LEFT JOIN ,是只要A表里有的,不管B表里有没有,都抽出来,所以就会出现无选择返回的情况。

家园 使用UNION Operator

SELECT aa,bb,dd FROM A WHERE aa=12345

UNION ALL

SELECT A.aa,A.bb,A.dd FROM A,B WHERE B.cc=23456 AND A.aa=B.aa


本帖一共被 1 帖 引用 (帖内工具实现)
家园 主要是考虑到最后得到结果的排序后取部分

一开始是觉得UNION是不是把两块内容返回后拼在一起。现在看来是混合的。后来是考虑到union后的结果需要排序的问题。

主要是还要有个 order by A.aa LIMIT 10 这样的语句。如果 UNION 后的记录很多,这个 ORDER BY 应该是用 filesort 的方式,效率估计会比较低。

家园 这个看来应该是正解了

大致试了一下,好像是对的。有好几个回复里也都提到这个方式。不知道效率怎样。我的理解是,先LEFT JOIN,然后对这个 JOIN 后的结果做 WHERE 判断,A.aa=12345大概可以用 A中的 aa 的索引,但是 B.cc=23456 大概就不能用 B 中 cc的索引,而是对所得结果用 file sort?

家园 如果那个subselect 返回比较多的话

用 IN 的效率是不是会比较低一些?

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河