簡體   English   中英

如何僅選擇每個類別的一條記錄?

[英]How to select only one record of each category?

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

您可以通過使用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
  );

首先,將名為Group的字段更改為Group_Name GROUP是保留的關鍵字,如果現在不引起問題,則稍后可能會出現。

其次,你應該問自己自己到底在追求什么。 以下查詢應生成您想要的結果。 它添加了一個附加條件,其中返回的ID是每個組中編號最小的ID。

SELECT * FROM products 
WHERE sold = 0
      AND ID IN (SELECT MIN(ID) FROM products WHERE sold = 0 GROUP BY Group_Name)

但是,為什么要這樣呢? 那不是正常的期望結束狀態。 您應該問自己為什么要關心ID。 您的目標似乎是找出哪些產品沒有售出任何東西。 在這種情況下,我建議您改為:

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

我通過使用語句GROUP BY找到了解決方案,

SELECT * FROM products WHERE sold = 0 GROUP BY group

在現在的結果中,我只為每個組獲得一條記錄,並且沒有添加任何其他語句就獲得了最小id,並且在我的真實表中,我使用product_group而不是group,因為這是保留字。

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM