我有一些MySQL的結果是這樣的:將結果限制爲n個唯一的列值?
---------------------------
| name | something_random |
---------------------------
| john | ekjalsdjalfjkldd |
| alex | akjsldfjaekallee |
| alex | jkjlkjslakjfjflj |
| alex | kajslejajejjaddd |
| bob | ekakdie33kkd93ld |
| bob | 33kd993kakakl3ll |
| paul | 3k309dki595k3lkd |
| paul | 3k399kkfkg93lk3l |
etc...
這正好爲結果的行1000的。我需要將結果數量限制爲前50個唯一名稱。我認爲這是一個簡單的解決方案,但我不確定。
我試過使用派生表和變量,但不能完全到達那裏。如果我能想出每次名稱不同時如何增加一次變量,我想我可以說WHERE variable <= 50
。
修訂
我已經試過了內部連接方法(ES)以下建議。問題是這樣的:
子選擇SELECT DISTINCT name FROM testTable LIMIT 50
抓住前50個不同的名稱。也許我在原始文章中不夠清楚,但這太限制了我的查詢。在我的查詢中,並不是表中的每個名字都返回結果中。讓我修改我的原始示例:
----------------------------------
| id | name | something_random |
----------------------------------
| 1 | john | ekjalsdjalfjkldd |
| 4 | alex | akjsldfjaekallee |
| 4 | alex | jkjlkjslakjfjflj |
| 4 | alex | kajslejajejjaddd |
| 6 | bob | ekakdie33kkd93ld |
| 6 | bob | 33kd993kakakl3ll |
| 12 | paul | 3k309dki595k3lkd |
| 12 | paul | 3k399kkfkg93lk3l |
etc...
所以我在這裏添加了一些id號。這些ID號碼與表格中的人員姓名相關。因此,您可以在結果中看到,表中不是每個人都必須在結果中(由於某個WHERE條件)。因此,在列表中的第50個獨立的名稱將始終有一個ID號高於49. 50人可能是編號79,234,4954等..
所以回到問題。子選擇SELECT DISTINCT name FROM testTable LIMIT 50
選擇表格中的前50個名稱。這意味着我的搜索結果將僅限於ID爲< = 50的名稱太緊密。如果某些名稱在查詢中沒有顯示(由於某個WHERE條件),那麼它們仍被視爲50個不同名稱之一。所以你最終得到的結果太少了。
更新2
要@trapper:這是什麼我的查詢看起來像一個基本的簡化:
SELECT
t1.id,
t1.name,
t2.details
FROM t1
LEFT JOIN t2 ON t1.id = t2.some_id
INNER JOIN
(SELECT DISTINCT name FROM t1 ORDER BY id LIMIT 0,50) s ON s.name = t1.name
WHERE
SOME CONDITIONS
ORDER BY
t1.id,
t1.name
而且我的結果是這樣的:
----------------------------------
| id | name | details |
----------------------------------
| 1 | john | ekjalsdjalfjkldd |
| 3 | alex | akjsldfjaekallee |
| 3 | alex | jkjlkjslakjfjflj |
| 4 | alex | kajslejajejjaddd |
| 6 | bob | ekakdie33kkd93ld |
| 6 | bob | 33kd993kakakl3ll |
| 12 | paul | 3k309dki595k3lkd |
| 12 | paul | 3k399kkfkg93lk3l |
...
| 37 | bill | kajslejajejjaddd |
| 37 | bill | ekakdie33kkd93ld |
| 41 | matt | 33kd993kakakl3ll |
| 50 | jake | 3k309dki595k3lkd |
| 50 | jake | 3k399kkfkg93lk3l |
----------------------------------
的結果在id = 50處停止。列表中不包含50個不同的名稱。只有大約23個不同的名字。
LIMIT 0,50無關與ID行。它盲目地從整個結果集中取0到50行並返回它們。因此,只要在他之前不超過49個獨特的名字,你就會很高興地獲得名字'jim',id '79,234,4954'。 – trapper 2012-03-02 18:03:06
@trapper看看我上面的第二個更新。 – 2012-03-02 18:29:25
你的'WHERE'條件可能在錯誤的地方,它應該放在括號內的'SELECT'中,除非你想在*已經把它縮減到50個名字後將它應用到結果*。 – trapper 2012-03-02 21:43:31