这应该很简单,但我坚持下去,在这里找不到答案。
如果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
}。
答案 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完成,但我认为这样可以。