2013-11-20 64 views
0

是否有可能獲得特定值(如ID = 5),並且除此之外還有兩個或三個來自同一個表的其他隨機值?mysql - 在一個查詢中獲取顯式值和隨機值

這裏是我的查詢:

SELECT name, solution, MAX(solution) 
FROM tracks 
WHERE id !=5 
GROUP BY name 
ORDER BY RAND() 
LIMIT 0 , 30 

我想要做什麼:
我有一個測驗,我需要從數據庫獲取三個答案。在我的第一個查詢中,我得到了實際答案,而在第二個查詢中(上面的查詢),我得到另外兩個不是實際答案的答案(ID!=)。

問題是,在我的表中,4個值是相同的,他們具有相同的名稱,所以如果我的實際答案是ID = 5,上面的查詢可能會選擇帶9的ID(它是與ID = 5相同的名稱)。

我該如何避免這種情況?

謝謝!

回答

0

是的,這是可能的。爲此使用UNION。 (sqlfiddle here

SELECT * FROM ((
    SELECT id, name, max(solution) as solution 
    FROM tracks 
    WHERE id = 5 
    GROUP BY name 
    LIMIT 0, 1 
    ) 
    UNION (
    SELECT id, name, solution 
    FROM tracks 
    WHERE id != 5 
    GROUP BY name 

)) tmp ORDER BY RAND() LIMIT 0, 3 
+0

是的,我想到了聯盟......我會檢查一下! – Marek123

+0

我在tmp上遇到錯誤? – Marek123

+0

@ Marek123我更新了我的答案:以SQL和sqlfiddle爲例。 – Kleskowy

0

也許你可以一個子查詢添加到您的where子句中查找不屬於標識不具有相同的解決方案的名稱所有的解決方案:

SELECT name, solution, MAX(solution) 
FROM tracks 
WHERE id !=5 
--check that the id is not in the subquery and the name doesnt match: 
AND id not in (select id from tracks t where id!=5 and t.name <> name) 
GROUP BY name 
ORDER BY RAND() 
LIMIT 0 , 30 
0

隨機的結果是隨機的。如果你想確保你沒有得到與答案同名的結果,你必須按名稱過濾。

SELECT name, solution, MAX(solution) 
FROM tracks 
WHERE id != 5 AND name != (SELECT name FROM tracks WHERE id = 5) 
GROUP BY name 
ORDER BY RAND() 
LIMIT 0 , 30 
+0

這是真正的交易!謝謝! – Marek123