Mysql

獲取由另一列排序的第 n 個不同的列值

  • July 22, 2015

我想獲取一列中具有第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 行”*。替換1000OFFSET 999
SELECT email_address
   FROM footable
   GROUP BY email_address
   ORDER BY MIN(created_at) ASC
   LIMIT 1
   OFFSET 999 ;

引用自:https://dba.stackexchange.com/questions/107756