2017-06-01 59 views
-2

檢索AA組數字。如果我有表:MySQL查詢到從各組

------------------ 
| Provider | ID | 
------------------ 
| X  | 125 | 
------------------ 
| X  | 133 | 
------------------ 
| X  | 342 | 
------------------ 
| X  | 327 | 
------------------ 
| Y  | 123 | 
------------------ 
| Y  | 853 | 
------------------ 
| Y  | 123 | 
------------------ 
| Z  | 853 | 
------------------ 
| Z  | 533 | 
------------------ 
| Z  | 174 | 
------------------ 

我想從每個供應商X和Y得到2個隨機項(忽略Z)生產

X id 
X id 
Y id 
Y id 

我試過幾個查詢包括

select id, provider from tableName a where (SELECT COUNT(*) FROM tableName b where b.provider = a.provider) = 2; 

任何想法?

回答

1

按rand()排序,並將x和y的where子句限制爲2,並將所有結果聯合起來。顯然你明白你想要做什麼並且容易維護。

SELECT Provider, ID 
FROM tableName 
WHERE provider = 'X' 
ORDER BY Rand() 
LIMIT 2 

UNION ALL 

SELECT Provider, ID 
FROM tableName 
WHERE provider = 'Y' 
ORDER BY Rand() 
LIMIT 2 
1

你怎麼樣嘗試此查詢:

select provider, ID, Rank from 
(
    select *, @row_num := IF(@prev_value=provider,@row_num+1,1) AS rank, @prev_value := provider from 
    (
     select provider, ID, rand() as SortingField from yourTable 
     order by provider, SortingField 
    ) t1, 
    (SELECT @rownum := 0) x, (SELECT @prev_value := '') y 
) src 
where Rank <= 2 and Provider <> 'Z' 

好了,所以這裏是如何工作的。首先,你需要隨機的條目,所以你需要添加一個「隨機」排序字段,我使用mySql的rand()函數。由於它給出了一個隨機數,你的字段將會隨機排序。

這使我們爲您的需求的下一位,這是兩個隨機條目。由於您的字段是隨機排序的,因此我們只需選取前兩個記錄,每次查詢運行時記錄都會有所不同。要做到這一點,我們需要一個行計數器,每當所需的字段更改值(在您的情況下,它是'提供者')重置。所以這就是我們正在使用的變量:

@rownum是您的行計數器,每次出現新記錄時都會加1。

@prev_value是您用來確定計數器何時需要重置的值檢查器。請注意,它是在@row_num遞增之後設置的,這很關鍵,因爲如果您之前設置了它,則會檢查當前值,這是毫無意義的。最後,你所要做的就是選擇所需的字段(provider,ID,Rank)並且抓取低於2的等級並且忽略'Z'提供者,這是查詢的最後部分所做的。

如果您有任何問題,請不要猶豫,但我希望我的解釋清楚。