【问题标题】:MYSQL select count(*) in one table if id exists in another table如果 id 存在于另一个表中,MYSQL 在一个表中选择 count(*)
【发布时间】:2018-03-20 01:18:42
【问题描述】:

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

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

类似:

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

总而言之,如果table_2 包含 22 的 user_id,则返回 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

【问题讨论】:

  • 你能提供样本数据和想要的结果吗?你的要求对我来说没有意义。您在where 中进行了比较,然后您说有东西返回-1

标签: mysql sql select count 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

【讨论】:

  • 加入是一种惩罚。
  • 这看起来有点过于复杂,而且做两个计数和一个连接可能很昂贵?我不需要计算table_2中的匹配数,只需要知道是否至少有一个匹配。
  • MySql 返回错误:#1248 - 每个派生表都必须有自己的别名
  • @freeworlder 哎呀,忘记了 MySQL 中的限制。已编辑和修复。
  • 有效!伟大的!这真的是您认为最有效的方法吗?
【解决方案2】:

这是否会给您所需的结果?

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 来完成,但我认为这会奏效。

【讨论】:

  • 我无法让它工作。很多语法错误。意外的关键字。 (在位置 12 的“COUNT”附近) CASE 表达式的意外结束(在位置 11 的“”附近)无法识别的关键字。 (在位置 12 的“COUNT”附近)意外的令牌。 (靠近位置 17 的“(”)意外标记。(靠近位置 18 的“*”)意外标记。(靠近位置 19 的“)”)无法识别的关键字。 (位置 21 的“WHEN”附近)意外标记。 (位置 26 的“0”附近)无法识别的关键字。 (在位置 28 的“THEN”附近)意外标记。 (靠近位置 33 的“-1”)... ??
  • 我不确定为什么会出现这些语法错误,使用 SELECT COUNT(*) 并且 CASE 是有效的语法。有机会我会对照 MySQL 数据库检查它。
  • 我检查了语法,看起来不错。您是否有任何额外的报价或对此进行了任何更改?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2016-03-09
  • 2013-10-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多