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将返回2user_id = 23将返回-1

+0

你能提供样品数据和想要的结果吗?你的请求对我没有意义。你在'where'里有一个比较,然后你说某些东西返回'-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 
+0

JOIN是一种惩罚。 –

+0

这看起来有点过于复杂,可能昂贵做两个计数和一个连接?我不需要计算table_2中的匹配数量,只需要知道是否至少有一个匹配。 – freeworlder

+0

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

有几个方法可以做到这一点 - 它可能被用做左加入或一个存在,但我认为这将工作。

+0

我无法得到这个工作。很多语法错误。意外的关键字。 (近“COUNT”位置12处)的情况下表达的 意外结束(近“” 11位) 无法识别的关键字。 (在位置12处的“COUNT”附近) 意外的令牌。 (近 “(” 第17位) 意外令牌。(近 “*” 在位置18) 意外令牌。(近 “)” 在位置19) 无法识别的关键字。 (在位置21的“WHEN”附近) 意外的标记。 (在位置26的“0”附近) 无法识别的关键字。 (在位置28的“THEN”附近) 意外的标记。(在位置33附近“-1”)...? – freeworlder

+0

我不知道为什么这些语法错误出现,使用SELECT COUNT(*)和CASE是有效的语法。当我有机会时,我会在MySQL数据库中检查它。 – bbrumm

+0

我检查了语法,它看起来很好。你有任何额外的报价,或者你有任何改变吗? – bbrumm