我正在尝试使用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 |
答案 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 join
到remake_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
值,则可以在不创建临时表并向其中插入值的情况下提取所需结果。
要符合资格,该表必须
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示例。