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

时间:2015-04-07 13:27:20

标签: 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_id | COUNT(*) |
+----------+----------+
|    1     |    8     |
|    2     |    8     |
|    100   |    0     |

3 个答案:

答案 0 :(得分:2)

您可以这样编写查询:

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

LEFT JOIN将返回左侧子查询中的所有行,COUNT(remake_error_type.order_id)将计算连接成功的所有值。

答案 1 :(得分:1)

您可以创建临时表,根据需要插入尽可能多的order_ids,然后执行left joinremake_error_type。在少量订单中,其他答案就足够了,但是如果您为大量订单执行此操作,则UNION ALL和子查询效率低下,无论是键入还是在服务器上执行。

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

但是,这仅在数据库用户具有足够权限时才有效:至少选择,创建临时表和删除表。

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_id值,则可以在不创建临时表并向其中插入值的情况下提取所需结果。

要符合资格,该表必须

  • 有一个自动增量主键,#rows大于最大搜索order_id
  • 的起始增量值小于最小搜索order_id
  • 主键中没有缺失值(即没有记录被删除)

如果存在限定表,则可以运行以下查询,您必须将surrogate替换为qualified table name,将surrogate_id替换为auto-incrementing primary key qualified table name

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

答案 2 :(得分:0)

你可以使用联盟。不,这不使用IN运算符,但它是一种替代方案,可以为您提供预期的结果。一种选择是硬编码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;

以下是SQL Fiddle示例。