我不是很擅长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
答案 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
);
还有其他方法更有效,但这对于几千行来说应该没问题。