我有两张由user_id连接的桌子。在下面的查询中,我比较表2中的act_val,以确保它介于或等于表2中的min_valmax_val。但有时表一中的auser_id在表二中找不到。在这些情况下,我希望act_val被当作0来处理,并在表1的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;

最佳答案

在左连接条件(ON子句)中需要用户id链接,在WHERE子句(filter)中需要其余链接。tb2.act值丢失时,使用IFNULL将其视为0。我还修复了您的第二个条件,它应该是tb1.max_val>=而不是tb1.min_val>=

     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部分中没有右表的匹配行,则右表将使用所有列都设置为空的行。可以使用此事实在表中查找在其他表中没有对应项的行:

关于mysql - 如何从MySQL将NULL值视为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5292076/

10-11 07:32