[英]Select a column only if id is distinct MySQL
我有下表:
AMAZON_ID | DATE | STATUS
1 | 01/03/2014 | Pending
1 | 01/03/2014 | Shipped
2 | 01/04/2014 | Pending
3 | 01/05/2014 | Cancelled
4 | 01/06/2014 | Pending
如何从状态等于表的表中选择最早的日期,待处理的id的计数不大于1,则应类似于以下内容:
AMAZON_ID | DATE | STATUS
2 | 01/04/2014 | Pending
我无法弄清楚,这是我到目前为止所无法解决的问题:
SELECT date
FROM table
WHERE status = 'Pending'
AND COUNT(id) < 2
ORDER BY date ASC
LIMIT 1;
使用子查询GROUP BY
的id
具有的COUNT
1.确保你的id是IN
这个子查询的结果,与status
未决。 然后按ORDER BY
日期和LIMIT
到第一个结果。
SELECT date
FROM table
WHERE
status = 'Pending' AND
id IN (
SELECT id
FROM table
GROUP BY id
HAVING COUNT(*) = 1
)
ORDER BY date ASC
LIMIT 1;
您可以做的一件事是使用WHERE IN,然后使用select语句用不同的ID填充WHERE子句
SELECT date
FROM table
WHERE status = 'Pending'
AND id IN (SELECT DISTINCT id FROM table)
ORDER BY date ASC
LIMIT 1;
这取决于您真正的意思是“ id的数量不超过一个” 。
我已将您的列日期重命名为ts,以使查询成为有效的SQL(因为DATE是SQL函数,因此它可能会使解析器迷惑)。 有关我使用的完整架构和示例查询,请参见SQL提琴 。
在这种情况下,您会遇到问题,因为您希望查询获取一条信息(最短日期),该信息基于关于同一张表的另一条信息。 这意味着您需要查询,幸运的是,您可以将两个查询的数据连接起来并进行适当的过滤。
SELECT data.id, status, MIN(ts)
FROM data
JOIN (SELECT id, COUNT(*) AS amount FROM data GROUP BY id) AS totals
ON totals.id = data.id
WHERE
status = "Pending"
AND totals.amount < 2
GROUP BY data.status;
注意 :此答案不能回答OP的问题
在这种情况下,情况非常简单,因为您可以只过滤状态为
“ pending”的所有行,最短日期和与您的结果匹配的行的总数,并在汇总(即:使用
HAVING )后过滤那些少于2个金额。
在SQL中将是:
SELECT id, status, MIN(ts) AS minTS, COUNT(*) AS amount FROM data WHERE status = "Pending" GROUP BY id, status HAVING amount < 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.