繁体   English   中英

仅当id与MySQL不同时才选择一列

[英]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 BYid具有的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提琴

选项2:每个ID 总计一行

在这种情况下,您会遇到问题,因为您希望查询获取一条信息(最短日期),该信息基于关于同一张表的另一条信息。 这意味着您需要查询,幸运的是,您可以将两个查询的数据连接起来并进行适当的过滤。

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;

选项1(简单):每个ID仅一个 待处理的

注意 :此答案不能回答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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM