主题:【求助】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)
则无选择返回全部
不知道谁有好办法?
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
replace "LEFT JOIN" by "INNER JOIN"
SELECT <column_name1>, <column_name2> FROM <tbl_name> INNER JOIN <tbl_name> ON <join_conditions>
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
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 ?
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 )
和
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表里有没有,都抽出来,所以就会出现无选择返回的情况。
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?
用 IN 的效率是不是会比较低一些?