如果另一个表中存在id,则MYSQL在一个表中选择count(*)

时间:2017-10-08 21:14:44

标签: mysql sql select count where

这应该很简单,但我坚持下去,在这里找不到答案。

如果user_id存在于另一个表中,或者如果不返回-1,我想计算一个表中与给定user_id匹配的记录数。

类似的东西:

SELECT COUNT(*) 
FROM table_1
WHERE user_id = (IF EXISTS table_2.user_id = '22')
, ELSE -1;

总之,如果table_2包含user_id为22,则返回table_1中的user_id为22的记录数,如果不是,则返回 - 1。

我该怎么做? (注意:只是为了澄清,user_id不是两个表中的主键)

编辑:添加表格示例:

table_1
---------------------
user_id  |  item
---------------------
22       |  apple
23       |  orange
22       |  banana

table_2
---------------------
user_id  |  name
---------------------
20       |  billy
21       |  bob
22       |  thornton

因此,user_id = 21运行我需要的查询将返回0,使用user_id = 22运行将返回2,而user_id = 23将返回-1 }。

2 个答案:

答案 0 :(得分:1)

您可以使用的一个简洁(脏?)技巧是从两个表中选择计数并交叉连接结果。由于您在没有group by条款的情况下查询汇总函数,因此您可以保证在每个结果中获得一行:

SELECT     CASE cnt_2 WHEN 0 THEN -1 ELSE cnt_1 END 
FROM       (SELECT COUNT(*) AS cnt_1
            FROM   table_1
            WHERE  user_id = 22) t
CROSS JOIN (SELECT COUNT(*) AS cnt_2
            FROM   table_2
            WHERE  user_id = 22) s

答案 1 :(得分:1)

这能为您提供所需的结果吗?

SELECT
CASE COUNT(*) WHEN 0 THEN -1 ELSE COUNT(*) END AS row_count
FROM table_1
WHERE user_id = 22
AND (
  SELECT COUNT(*)
  FROM table_2
  WHERE user_id = 22) >= 1;

它使用CASE语句来实现检查,如果没有找到记录则显示-1。它使用WHERE子句中的子查询来查找table_2中的记录计数,并检查它是否大于或等于1.

有几种方法可以做到这一点 - 可以通过LEFT JOIN或EXISTS完成,但我认为这样可以。