Mysql
獲取由另一列排序的第 n 個不同的列值
我想獲取一列中具有第n個不同值的行,按另一列排序。
更實際地說,我想要第 1000 個不同
email_address
的按 排序created_at
,並且該email_address
列沒有唯一約束。我相信我已經通過以下查詢正確地做到了這一點:
SELECT `email_address` FROM footable GROUP BY `email_address` ORDER BY `created_at` ASC LIMIT 1 OFFSET 1000
但我並不完全相信這給了我正確的價值。
上述查詢是否適用於此目的?如果沒有,我應該如何解決這個問題?
您需要進行兩項更改:
- 一個主要的:在查詢中使用非聚合列
GROUP BY
會產生不可預知的結果 - 遺憾的是 MySQL 中的預設設置允許這種類型的查詢,並且在 5.7 版本中進行了更正。您查詢的問題是電子郵件地址可以出現在許多行中 -具有許多不同的
created_at
值- 問題是:MySQL 將使用這些不同值中的哪一個ORDER BY
?答案是其中任何一個。它通常是它會找到的第一個,但這裡的“第一個”可能意味著不同的東西,具體取決於執行計劃和可用索引。因此,結果將不是確定的,並且可能會從一次執行更改為另一次執行。您可以改用
MIN(created_at)
,ORDER BY
問題就解決了。
- 次要的:
OFFSET x
表示*“跳過 x 行”*。替換1000
為OFFSET 999
:SELECT email_address FROM footable GROUP BY email_address ORDER BY MIN(created_at) ASC LIMIT 1 OFFSET 999 ;