簡體   English   中英

如何使用SQL group by從一個條件中獲取多個字段?

[英]How to get multiple fields from one criteria using SQL group by?

該查詢可能返回錯誤的名稱,因為我要查詢的名稱是每種物種中最小的動物。 我怎樣才能得到正確的a.name

SELECT 
a.name,
MIN(a.size)

FROM animal a
LEFT JOIN species s ON s.idSpecies = a.idAnimal

GROUP BY s.id

一種方法是,首先找到每個物種最小的動物大小(就像您所做的那樣),盡管我假設物種永遠不會為空,因為動物必須屬於某個物種,但它也不需要加入此時的物種:

SELECT  a.IDSpecies, MIN(a.Size) AS Size
FROM    Animal AS a
GROUP BY a.IDSpecies

現在,您可以將該查詢的結果重新加入主查詢以過濾結果。

SELECT  a.Name AS AnimalName,
        a.Size,
        s.Name AS SpeciesName
FROM    Animal AS a
        INNER JOIN Species AS s
            ON s.ID = a.IDSpecies
        INNER JOIN
        (   SELECT  a.IDSpecies, MIN(a.Size) AS Size
            FROM    Animal AS a
            GROUP BY a.IDSpecies
        ) AS ma
            ON ma.IDSpecies = a.IDSpecies
            AND ma.Size = a.Size;

另一種方法是使用NOT EXISTS

SELECT  a.Name AS AnimalName,
        a.Size,
        s.Name AS SpeciesName
FROM    Animal AS a
        INNER JOIN Species AS s
            ON s.ID = a.IDSpecies
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    Animal AS a2
            WHERE   a2.IDSpecies = a.IDSpecies
            AND     a2.Size < a.Size
        );

因此,從一個簡單的選擇開始,然后使用NOT EXISTS刪除任何動物,其中相同物種中存在較小的動物。

由於MySQL NOT EXISTS更好地優化LEFT JOIN/IS NULL ,因此在MySQL中編寫查詢的更好方法是:

SELECT  a.Name AS AnimalName,
        a.Size,
        s.Name AS SpeciesName
FROM    Animal AS a
        INNER JOIN Species AS s
            ON s.ID = a.IDSpecies
        LEFT JOIN Animal AS a2
            ON a2.IDSpecies = a.IDSpecies
            AND a2.Size < a.Size
WHERE   a2.ID IS NULL;

該概念與NOT EXISTS 完全相同 ,但是不需要相關的子查詢。

以下是分組依據的簡單示例:

SELECT C.CountryName Country, SN.StateName,  COUNT(CN.ID) CityCount 
FROM Table_StatesName SN 
JOIN Table_Countries C ON C.ID = SN.CountryID
JOIN Table_CityName CN ON CN.StateID = SN.ID
GROUP BY C.CountryName,  SN.StateName  ORDER BY SN.StateName

輸出:

Country         StateName                       CityCount

Australia       Australian Capital Territory    219
Australia       New South Wales                 2250
Australia       Northern Territory              218
Australia       Queensland                      2250
Australia       South Australia                 1501
Australia       Tasmania                        613
Australia       Victoria                        2250

獲取所有大小為=最小大小的行。 使用相關子查詢器來找到最小的大小:

SELECT *
FROM animal a
  LEFT JOIN species s ON s.idSpecies = a.idAnimal
where a.size = (select min(a2.size)
                from animal a2
                  LEFT JOIN species s2 ON ss.idSpecies = as.idAnimal
                where s.id = s2.id)

暫無
暫無

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

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