仅当id是不同的MySQL时才选择列

时间:2014-01-09 22:09:49

标签: php mysql sql

我有下表:

  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;

3 个答案:

答案 0 :(得分:4)

使用子查询GROUP BY idCOUNT的{​​{1}}。确保您的ID是IN此子查询的结果,status等待的1}}然后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;

答案 1 :(得分:0)

您可以做的一件事是使用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;

答案 2 :(得分:0)

这取决于你的真实含义“id的数量不超过一个”

我已将列 date 重命名为 ts 以使查询成为有效的SQL(因为DATE是一个SQL函数,因此可能会混淆解析器)。请参阅SQL fiddle for the complete schema I used and the example queries

选项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

<击>