如何在同一个表上组合两个查询以在MySQL中获取单个结果集

时间:2017-11-11 09:20:11

标签: mysql sql join union

我不是很擅长sql,但我到了那里。我已经搜索了stackoverflow,但我似乎无法找到解决方案,我希望有人可以帮助我。我有一个表(用户)与如下数据。 book_id列是包含用户订阅的书的另一个表的键。

|--------|---------------------|------------------|
|   id   |      book_id        |       name       |
|--------|---------------------|------------------|
|   1    |         1           |        jim       |
|   2    |         1           |       joyce      |
|   3    |         1           |        mike      |
|   4    |         1           |       eleven     |
|   5    |         2           |        max       |
|   6    |         2           |       dustin     |
|   7    |         2           |       lucas      |
|--------|---------------------|------------------|

我的PHP代码中有一个函数,它返回来自特定书籍ID(1或2)的两个随机用户。查询1返回第1列中的结果,结果2返回第2列中的结果,如:

|---------------------|------------------|
|          1          |        2         |
|---------------------|------------------|
|        jim          |       max        |
|       joyce         |     dustin       |
|---------------------|------------------|

我通过运行两个单独的查询来实现此目的,如下所示。我想知道是否可以通过一个查询以及如何实现此功能。

$random_users_with_book_id_1 = SELECT name FROM users WHERE book_id=1 LIMIT 2
$random_users_with_book_id_2 = SELECT name FROM users WHERE book_id=2 LIMIT 2

我再次道歉,如果它太具体了。下面的查询最接近我试图实现的目标。:

SELECT a.name AS book_id_1, b.name AS book_id_2   
FROM users a, users b 
WHERE a.book_id=1 AND b.book_id = 2
LIMIT 2
编辑:我创造了一个小提琴来玩他的。我感谢任何帮助!谢谢!! http://sqlfiddle.com/#!9/7fcbca/1

2 个答案:

答案 0 :(得分:2)

实际上很容易:)

你可以像这样使用UNION:

SELECT * FROM (
     (SELECT * FROM user WHERE n_id=1 LIMIT 2)
     UNION
     (SELECT * FROM user WHERE n_id=2 LIMIT 2)) 
 collection;

如果您阅读有关the documentation的文章,您可以使用()对各个查询进行分组,并在中间应用联合。没有括号,它仍将是LIMIT 2并且仅显示两个。参考。 "要将ORDER BY或LIMIT应用于单个SELECT,请将该子句放在括起SELECT的括号内:"

答案 1 :(得分:1)

如果要在MySQL中组合查询,可以使用括号:

(SELECT name
 FROM users
 WHERE n_id = 1
 LIMIT 2
) UNION ALL
(SELECT name
 FROM users
 WHERE n_id = 2
 LIMIT 2
);

首先,如果您特别想要消除重复项的开销,请仅使用UNION。否则,请使用UNION ALL

其次,这不会返回随机行。这将返回任意行。在许多情况下,这可能是数据开头附近的两行。如果您想要随机行,请使用ORDER BY rand()

(SELECT name
 FROM users
 WHERE n_id = 1
 ORDER by rand()
 LIMIT 2
) UNION ALL
(SELECT name
 FROM users
 WHERE n_id = 2
 ORDER BY rand()
 LIMIT 2
);

还有其他方法更有效,但这对于几千行来说应该没问题。