感谢您编写等效查询的一些帮助。
我有下表:
+------+----------+---------------+
| id | group_id | question_body |
+------+----------+---------------+
| 1001 | 101 | q1 |
| 1002 | 101 | q2 |
| 1003 | 102 | q3 |
| 1004 | 103 | q4 |
| 1005 | 103 | q5 |
| 1006 | 104 | q6 |
| 1007 | 105 | q6 |
| 2001 | 201 | q7 |
| 2002 | 202 | q8 |
| 2003 | 203 | q9 |
| 2004 | 204 | q10 |
| 2005 | 204 | q11 |
| 2006 | 204 | q12 |
| 2007 | 204 | q13 |
| 2008 | 205 | q14 |
| 3001 | 301 | q16 |
| 3002 | 301 | q17 |
| 3003 | 302 | q18 |
| 3004 | 302 | q19 |
| 3005 | 303 | q20 |
| 3006 | 304 | q21 |
| 3007 | 305 | q22 |
| 3008 | 305 | q23 |
| 3009 | 305 | q24 |
+------+----------+---------------+
通过使用UNION之间的一系列查询,我得到了我需要的确切结果,但我不能使用UNION:(
所以我的查询是:
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 101 ORDER BY RAND() LIMIT 1
) as g101
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 102 ORDER BY RAND() LIMIT 1
) AS g102
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 103 ORDER BY RAND() LIMIT 1
) AS g103
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 104 ORDER BY RAND() LIMIT 1
) AS g104
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 105 ORDER BY RAND() LIMIT 1
) AS g105
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 201 ORDER BY RAND() LIMIT 1
) as g201
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 202 ORDER BY RAND() LIMIT 1
) AS g202
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 203 ORDER BY RAND() LIMIT 1
) AS g203
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 204 ORDER BY RAND() LIMIT 1
) AS g204
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 205 ORDER BY RAND() LIMIT 1
) AS g205
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 301 ORDER BY RAND() LIMIT 1
) as g301
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 302 ORDER BY RAND() LIMIT 1
) AS g302
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 303 ORDER BY RAND() LIMIT 1
) AS g303
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 304 ORDER BY RAND() LIMIT 1
) AS g304
UNION
SELECT *
FROM
(
SELECT questions.id FROM questions WHERE questions.group_id LIKE 305 ORDER BY RAND() LIMIT 1
) AS g305
;
每个group_id
都会这样,并随机选择附加到该组的问题。有没有更简单的方法来写这个没有UNION
?
答案 0 :(得分:1)
也许是这样的:
select g.*,
(select q.id
from questions q
where q.group_id = g.group_id
order by rand()
limit 1
) as question_id
from groups g;
每组选择一个随机行并不困难。多行比较棘手。
这假设您有一个名为groups
的表。如果没有,您可以使用from (select distinct group_id from questions) g
。