2012-03-01 53 views
3

我有一些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個不同的名字。

+0

LIMIT 0,50無關與ID行。它盲目地從整個結果集中取0到50行並返回它們。因此,只要在他之前不超過49個獨特的名字,你就會很高興地獲得名字'jim',id '79,234,4954'。 – trapper 2012-03-02 18:03:06

+0

@trapper看看我上面的第二個更新。 – 2012-03-02 18:29:25

+0

你的'WHERE'條件可能在錯誤的地方,它應該放在括號內的'SELECT'中,除非你想在*已經把它縮減到50個名字後將它應用到結果*。 – trapper 2012-03-02 21:43:31

回答

4

My MySql語法可能很生疏,但是想法是使用查詢來選擇前50個不同的名稱,然後對名稱進行自聯接,並從聯接中選擇名稱和其他信息。

select a.name, b.something_random 
from Table b 
    inner join (select distinct name from Table order by RAND() limit 0,50) a 
     on a.name = b.name 
+0

我會嘗試這種方法。這實質上是執行2個查詢?或2 * num_of_unique_names查詢?另外,你爲什麼內心加入一個表與自己? – 2012-03-01 23:40:21

+0

希望您有一個名稱索引,它將導致索引掃描加上同一個表上的索引連接。我想你可以調用這2個查詢,但使用遊標的時間很短,我不知道你會怎麼做。根據您的數據,使用光標可能會更糟糕,即全表掃描。當然,您需要名稱索引來避免加入。 – tvanfosson 2012-03-01 23:43:15

+0

@Jakobud--與此相關的一個潛在問題是,您可能會得到排名前50的字母名稱。如果是這樣,你可能想要拋出一個'Order By RAND()' - 再一次,我的語法可能需要一些修正。 – tvanfosson 2012-03-01 23:50:07

2
SELECT DISTINCT name FROM table LIMIT 0,50 

編輯:啊,是我誤解了問題的第一次,本應該做的伎倆雖然:)

SELECT a.name, b.something_random 
FROM `table` b 
INNER JOIN (SELECT DISTINCT name FROM `table` ORDER BY RAND() LIMIT 0,50) a 
    ON a.name = b.name ORDER BY a.name 

這項工作是怎樣的(SELECT DISTINCT name FROMORDER BY RAND() LIMIT 0,50)的部分是什麼翻出名稱,包括在加入。所以我在這裏隨機抽取了50個獨特的名字,但是如果你願意的話,你可以把它改成任何其他的選擇標準。

然後你將這些結果加回到你的表中。這將這50個選定名稱中的每一個都鏈接到所有具有匹配名稱的行,以獲得最終結果。最後ORDER BY a.name只是爲了確保每個名字的所有行最終分組在一起。

+0

所有似乎只是將結果限制爲50行。我想你誤解了我的問題。返回的行數是任意的。我只需要將結果限制在前50個不同的名稱。返回的行數可能是任何數字> 50. – 2012-03-01 23:38:57

+0

已更新的答案 – trapper 2012-03-02 17:59:00

1

這應做到:

SELECT tA.* 
FROM 
    testTable tA 
INNER JOIN 
    (SELECT distinct name FROM testTable LIMIT 50) tB ON tA.name = tB.name 
; 
+0

正如在tvanfosson的類似答案中指出的那樣,子查詢中的select可能需要以某種方式(或通過RAND())進行排序以獲得您想要的結果。 – StudyOfCrying 2012-03-01 23:51:42

+0

這讓我更接近,看看我上面的更新。 – 2012-03-02 16:15:00

相關問題