簡體   English   中英

MySQL按特定領域分組結果

[英]MySQL grouping results by specific field

我有一個名為“ test”的表,如下所示:

id     | location_id | date
1      | 1           | 2017-01-02
2      | 1           | 2017-01-03
3      | 2           | 2017-01-04
4      | 1           | 2017-01-05

我想要一個SELECT語句,該語句為每個location_id選擇一行並按日期排序。

由於ONLY_FULL_GROUP_BY的要求(以及其他數據庫的類似嚴格標准),我的特定問題是創建一條適用於MySQL 5.7.1及更高版本的語句。

SELECT id, location_id , date FROM test GROUP BY location_id  ORDER BY date

可以,但是在升級MySQL數據庫的那天無效。

SELECT id, location_id , date FROM test GROUP BY location_id, id, date  ORDER BY date

有效,但不起作用,它將返回所有結果。

我想要的是獲得上面第一個SELECT查詢的結果,但是要使用有效的SQL,它可以滿足未來的需求,它返回:

id     | location_id | date
1      | 1           | 2017-01-02
3      | 2           | 2017-01-04

任何幫助或見解如何解決這個贊賞!

根據您提供的樣本數據,您要執行以下操作:

SELECT  MIN(id) AS ID,
        Location_ID,
        MIN(Date) AS Date
FROM    test
GROUP BY Location_ID
ORDER BY Date 

我們已將匯總函數應用於id和date,因此您只需要在分組依據中保留location_id。 並且在相同的數據上,您似乎只選擇了最小的ID-日期。 這可能是一個誤導性的假設,所以讓我知道

編輯

根據我們的聊天,我提出了以下建議:

SELECT id, location_id, Date
FROM (
  SELECT t1.*,
         @cur := IF(location_id = @id, @cur+1, 1) AS RowNumber,
         @id := location_id AS IdCache
  FROM docs t1
  CROSS JOIN (
    SELECT @id:=(SELECT MIN(location_id) FROM docs), @cur:=0) AS init
   ORDER BY t1.location_id, date
) PartitionedData
WHERE RowNumber = 1
order by location_id

我所做的是復制MSSQL's ROW_NUMBER()並在location_id分區。 為了更好地了解該功能,請在此處閱讀

給定以下示例數據:

1 | 1 | 2017-01-02
2 | 1 | 2017-01-03
3 | 2 | 2017-01-04
4 | 1 | 2017-01-05

視圖PartitionedData將返回以下數據集:

id | location_id | date       | RowNumber | IdCache
1  | 1           | 2017-01-02 | 1         | 1
2  | 1           | 2017-01-03 | 2         | 1
4  | 1           | 2017-01-05 | 3         | 1
3  | 2           | 2017-01-04 | 1         | 2

“分區”基於我們選擇的@id,然后根據我們的排序。 如果我們將順序更改為t1.location_id, date desc則我們的數據集將為:

id | location_id | date       | RowNumber | IdCache
4  | 1           | 2017-01-05 | 1         | 1
2  | 1           | 2017-01-03 | 2         | 1
1  | 1           | 2017-01-02 | 3         | 1
3  | 2           | 2017-01-04 | 1         | 2

因此,根據我們訂購日期的方式,我們可以選擇最新的日期或第一次的日期-您必須在php中處理asc / desc。

最后,我們返回的數據將與ID一致,因此上述查詢將輸出:

id | location_id | date
1  | 1           | 2017-01-02
3  | 2           | 2017-01-04

讓我知道這是否更接近您要尋找的東西!

SELECT DISTINCT是否滿足您的需求?

SELECT DISTINCT id, location_id , date FROM test GROUP BY location_id, id, date  ORDER BY date

暫無
暫無

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

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