MYSQL SELECT COUNT(*)在一个表中,如果另一个表
存在ID这应该是很简单的,但我坚持它并不能在这里找到答案。MYSQL SELECT COUNT(*)在一个表中,如果另一个表
我想在那场比赛给定user_id
如果存在于另一个表user_id
,或者如果没有返回-1一个表来计算的记录数。
喜欢的东西:
SELECT COUNT(*)
FROM table_1
WHERE user_id = (IF EXISTS table_2.user_id = '22')
, ELSE -1;
总之,如果table_2
包含22 user_id
,然后在table_1
与22 user_id
返回的记录数,如果没有,返回-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
。
一个整齐(脏?)诱骗您可以使用是从两个表中选择数和交叉连接的结果。既然你要查询的聚集函数没有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
JOIN是一种惩罚。 –
这看起来有点过于复杂,可能昂贵做两个计数和一个连接?我不需要计算table_2中的匹配数量,只需要知道是否至少有一个匹配。 – freeworlder
MySql返回错误:#1248 - 每个派生表都必须有自己的别名 – freeworlder
这是否给你所需要的结果呢?
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
有几个方法可以做到这一点 - 它可能被用做左加入或一个存在,但我认为这将工作。
我无法得到这个工作。很多语法错误。意外的关键字。 (近“COUNT”位置12处)的情况下表达的 意外结束(近“” 11位) 无法识别的关键字。 (在位置12处的“COUNT”附近) 意外的令牌。 (近 “(” 第17位) 意外令牌。(近 “*” 在位置18) 意外令牌。(近 “)” 在位置19) 无法识别的关键字。 (在位置21的“WHEN”附近) 意外的标记。 (在位置26的“0”附近) 无法识别的关键字。 (在位置28的“THEN”附近) 意外的标记。(在位置33附近“-1”)...? – freeworlder
我不知道为什么这些语法错误出现,使用SELECT COUNT(*)和CASE是有效的语法。当我有机会时,我会在MySQL数据库中检查它。 – bbrumm
我检查了语法,它看起来很好。你有任何额外的报价,或者你有任何改变吗? – bbrumm
你能提供样品数据和想要的结果吗?你的请求对我没有意义。你在'where'里有一个比较,然后你说某些东西返回'-1'。 –