2013-11-20 56 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