mysql - 在mysql中不使用union重写sql查询

标签 mysql sql

我希望得到一些帮助来编写等效的查询。

我有下表:

+------+----------+---------------+
|  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 的代码?

最佳答案

也许是这样的:

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(从问题中选择不同的group_id)g

关于mysql - 在mysql中不使用union重写sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158379/

相关文章:

sql - 在 SQL Server 中匹配街道地址的方法有哪些?

sql - 插入...值(SELECT ... FROM ...)

php - 如何使用 PHP 表单在 MySQL 表中添加多列?

php - 如何从 Eloquent ,silex的中间表中获取数据

php - 如何在 WordPress 中左连接 wp_terms、wp_term_relationships、wp_term_taxonomy 和 wp_termmeta 表?

php - 如何比较数据库中的两个数组并获得差异

mysql - 最适合我的应用程序类型的数据库? MySQL? MongoDB? PostgreSQL?沙发数据库?

php - 从 ARRAY 中保存 SQL 数据,例如 print_r()

sql - PostgreSQL 查询选择除这些以外的所有

mysql - Visual Studio 错误 : Unable to load the stored procedure for editing