如何只选择每个类别的一条记录?

时间:2017-07-06 17:16:23

标签: php mysql sql

Products :
--------------------------------------------
|   ID   |   Group   |   Name   |   Sold   |
--------------------------------------------
|   1    |     A     |   Dell   |    0     |
--------------------------------------------
|   2    |     A     |   Dell   |    0     |
--------------------------------------------
|   3    |     B     |   Dell   |    1     |
--------------------------------------------
|   4    |     B     |   Dell   |    1     |
--------------------------------------------
|   5    |     C     |   Dell   |    0     |
--------------------------------------------
|   6    |     C     |   Dell   |    1     |
--------------------------------------------

大家好,我有一个存储在MySql中的表(产品)有很多记录,现在我正在使用这个查询SELECT * FROM products WHERE sold = 0,结果我得到了:

--------------------------------------------
|   ID   |   Group   |   Name   |   Sold   |
--------------------------------------------
|   1    |     A     |   Dell   |    0     |
--------------------------------------------
|   2    |     A     |   Dell   |    0     |
--------------------------------------------
|   5    |     C     |   Dell   |    0     |
--------------------------------------------

我想从每个组中只获得一条记录,因此结果将如下:

--------------------------------------------
|   ID   |   Group   |   Name   |   Sold   |
--------------------------------------------
|   1    |     A     |   Dell   |    0     |
--------------------------------------------
|   5    |     C     |   Dell   |    0     |
--------------------------------------------

4 个答案:

答案 0 :(得分:0)

您可以使用distinct子句并删除id列轻松完成此操作。如果您想保留id列,则需要指定人们如何选择要保留的id

select distinct
  `group`
  , name
  , sold
from
  products
where
  sold = 0;

要保持行id最小的行(如示例所示),可以使用下面示例中的某些内容。

select
  id
  , `group`
  , name
  , sold
from
  products
where
  sold = 0
  and id = (
    select
      min(p.id)
    from
      products p
    where
      p.`group`    = products.`group`
      and p.sold = 0
  );

答案 1 :(得分:0)

首先,将名为Group_Name的字段更改为SELECT * FROM products WHERE sold = 0 AND ID IN (SELECT MIN(ID) FROM products WHERE sold = 0 GROUP BY Group_Name) 。 GROUP是一个保留关键字,如果它现在没有引起你的问题,它可能会在以后发生。

其次,你应该问问自己你真正追求的是什么。以下查询应生成所需的结果。它添加了一个附加条件,其中返回的ID是每个组中编号最小的ID。

SELECT DISTINCT Group_Name, Name 
FROM products 
WHERE sold = 0 
ORDER BY Group_Name, Name

为什么你想这样呢?这不是正常的期望结束状态。你应该问问自己为什么要关心身份证。看起来您的目标是找出哪些产品没有出售任何东西。在这种情况下,我会建议这样做:

$pdf

答案 2 :(得分:0)

我现在在结果中使用语句 GROUP BY

SELECT * FROM products WHERE sold = 0 GROUP BY group

找到解决方案,我只得到每个组的一条记录和最小ID没有添加任何其他声明,并且在我的真实表中我使用 product_group 而不是,因为它是一个保留字。

答案 3 :(得分:-2)

试试这个:

SELECT `ID`, `Group`, `Name`, `Sold`  FROM products WHERE sold = 0 GROUP BY `Group`;