Mysql 如何使用'IN'运算符获取计数

Mysql 如何使用'IN'运算符获取计数,mysql,sql,Mysql,Sql,我试图使用IN操作符来获取表中某些字段的计数 这是我的疑问: SELECT order_id, COUNT(*) FROM remake_error_type WHERE order_id IN (1, 2, 100) GROUP BY order_id; 我的当前输出: | order_id | COUNT(*) | +----------+----------+ | 1 | 8 | | 2 | 8 | 我的预期产出: | order

我试图使用
IN
操作符来获取表中某些字段的计数

这是我的疑问:

SELECT order_id, COUNT(*)
FROM remake_error_type
WHERE order_id IN (1, 2, 100)
GROUP BY order_id;
我的当前输出:

| order_id | COUNT(*) |
+----------+----------+
|    1     |    8     |
|    2     |    8     |
我的预期产出:

| order_id | COUNT(*) |
+----------+----------+
|    1     |    8     |
|    2     |    8     |
|    100   |    0     |

您可以这样编写查询:

SELECT t.id, COUNT(remake_error_type.order_id)
FROM
  (SELECT 1 AS id UNION ALL SELECT 2 UNION ALL SELECT 100) as t
  LEFT JOIN remake_error_type
  ON t.id = remake_error_type.order_id
GROUP BY
  t.id

左连接
将返回左侧子查询中的所有行,
计数(重做错误类型.顺序id)
将对连接成功时的所有值进行计数。

您可以为此使用联合。不,这不使用中的
运算符,但它是一种可以为您提供预期结果的替代方法。一个选项是硬编码order_id,并使用条件聚合来获取具有该id的行的
SUM()

SELECT 1 AS order_id, SUM(order_id = 1) AS numOrders FROM myTable
UNION ALL
SELECT 2 AS order_id, SUM(order_id = 2) AS numOrders FROM myTable
UNION ALL
SELECT 100 AS order_id, SUM(order_id = 100) AS numOrders FROM myTable;

以下是一个示例。

您可以创建一个临时表,根据需要插入尽可能多的
order\u id
,并执行
左连接
重新生成错误类型
。对于少量订单,其他答案就足够了,但如果您对大量订单执行此操作,
UNION ALL
和子查询在键入和在服务器上执行时都效率低下

此外,这是一种非常动态的方法,因为您可以通过修改insert语句轻松控制temp表中的值

然而,只有当数据库用户具有足够的权限时,这才有效:至少选择、创建临时表和删除表

DROP TABLE IF EXISTS myTempOrders;
CREATE TEMPORARY TABLE myTempOrders (order_id INTEGER, PRIMARY KEY(order_id));
INSERT INTO myTempOrders (order_id) VALUES (1), (2), (100);

SELECT temp.order_id, count(*)

FROM myTempOrders temp
LEFT JOIN remake_error_type ON temp.order_id = remake_error_type.order_id
GROUP BY 1
如果某个表中存在
order\u id
值,则可以提取所需结果,而无需创建临时表并在其中插入值

要获得资格,表必须

  • 具有一个自动递增主键,其#行数大于所寻求的最大值
    order_id
    value
  • 起始增量值小于最小搜索的
    订单id
  • 主键中没有缺少的值(即没有删除任何记录)
如果存在限定表,则可以运行以下查询,其中必须使用限定表名
限定表名
替换
代理
,并使用
限定表名
自动递增主键
替换代理id

SELECT surrogate.surrogate_id, count(*)

FROM my_qualified_table surrogate
LEFT JOIN remake_error_type ON surrogate.surrogate_id = remake_error_type.order_id
WHERE surrogate.surrogate_id IN (1, 2, 100)
GROUP BY 1

例如,我在运算符(1,2100)中添加的数字就是一个例子,它是动态的,即它可以超过3个数字。我在运算符(1,2100)中添加的数字就是一个例子,它是动态的,即它可以超过3个数字。是的,顺序id是外键。我在运算符(即(1,2,100)例如,它是动态的,也就是说它可以超过3个数字那么你在查询中传递什么?数组?不是数组,我将传递超过100个数字,而且我没有创建或删除临时表的权限。非常感谢你的回答,我没有足够的权限创建临时表并删除它。我所能做的只是运行select查询。这些
order\u id
值是否存在于其他表中?然后您可以使用我编辑的答案。其他表中不存在任何order\u id。