我有两个由user_id
加入的表格。在下面的查询中,我正在比较table_two中的act_val
,以确保它位于table_one之间或等于min_val
和max_val
之间。但有时在table_two中找不到table_one中的user_id
。在这些情况下,我希望act_val
被视为0,并且限定table_one的min_val
更低的位置。那可能吗?怎么样?
SELECT tb1.id FROM table_one tb1
INNER JOIN table_two tb2 WHERE
tb1.min_val <= tb2.act_val AND tb1.min_val >= tb2.act_val
AND tb2.user_id = tb1.user_id
GROUP BY ad.id;
答案 0 :(得分:6)
您需要LEFT JOIN条件中的user_id链接(ON子句),WHERE子句中的其余部分(过滤器)。使用IFNULL时,tb2.act_val在缺失时被视为0。我还修正了你的第二个条件,它应该是tb1。 max _val&gt; = not tb1。 min _val&gt; =
SELECT tb1.id
FROM table_one tb1
LEFT JOIN table_two tb2 ON tb2.user_id = tb1.user_id
WHERE tb1.min_val <= IFNULL(tb2.act_val,0)
AND tb1.max_val >= IFNULL(tb2.act_val,0)
GROUP BY tb1.id;
如果LEFT JOIN中的ON或USING部分中的右表没有匹配的行,则将所有列设置为NULL的行用于右表。您可以使用此事实在表中查找在另一个表中没有对应项的行:
答案 1 :(得分:1)
使用OUTER联接(以下示例中的LEFT)获取TABLE2中可能具有或不具有匹配user_id值的所有TABLE1记录。然后构造WHERE子句以将记录集过滤到您想要的内容:
SELECT tb1.id
FROM table_one tb1
LEFT JOIN table_two tb2 ON tb2.user_id = tb1.user_id
WHERE tb2.act_val BETWEEN tb1.min_val AND tb1.max_val
OR tb1.min_val < 0
GROUP BY tb1.id
答案 2 :(得分:0)
使用IS_NULL或IS_NOT_NULL运算符。请参阅 http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
答案 3 :(得分:0)
您可以使用IFNULL(tbl2.act_val, 0)
答案 4 :(得分:0)
inner join
替换为left join
coalesce(tb2.act_val, 0)
代替tb2.act_val
PS此外 - 您的查询看起来不正确,因为您引用了未定义的表格广告。
答案 5 :(得分:0)
您可以使用COALESCE
功能:
WHERE COALESCE(tb1.min_val, 0) <= tb2.act_val COALESCE(tb1.min_val, 0) >= tb2.act_val