鉴于以下2个表
table_a
id name num_one num_two
------------------------------------
1 Foo 5 10
2 Bar 4 -1
table_b
name table_a_id
--------------------
Fooa 1
Foob 1
假设我想在where子句中使用ether num_one或num_two,具体取决于另一个表是否已加入行。
我能想到的最好的事情是:
SELECT a.* FROM table_a a
JOIN table_b b on b.table_a_id = a.id
WHERE if(count(b.*) > 0, a.num_one, a.num_two) > 0
group by a.id
理想情况下,它会检查5>第一行为0,-1> 2表示0,因为第2行没有表B中的连接行。
但它因无效使用group by而出错。我知道“有”但不确定如何在这种情况下使用它。
有什么想法吗?谢谢!
答案 0 :(得分:1)
这可以使用IF语句,OR语句或子查询来完成。在大型桌子上,这些都不会非常有效。
对原始陈述的唯一真正修改是使用NULL
而不是count(*)。
SELECT DISTINCT a.*
FROM table_a a
LEFT JOIN table_b b on b.table_a_id = a.id
WHERE (b.table_a_id is null AND a.num_one > 0)
OR (b.table_a_id is NOT NULL AND a.num_two > 0)