我有一个 MySQL 评论表,如下所示:
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| userid | int(11) | NO | | 0 | |
| comment | char(255) | NO | | NULL | |
| content | int(11) | NO | MUL | 0 | |
| ratings | int(11) | NO | | 0 | |
| datetime | datetime | NO | | NULL | |
| ip | int(10) unsigned | NO | | NULL | |
| is_updated | tinyint(2) | NO | | 0 | |
| record_num | int(11) | NO | PRI | NULL | auto_increment |
+------------+------------------+------+-----+---------+----------------+
现在我可以使用像这样的 INNER JOIN
查询从这个表中获取评论和从另一个表中获取用户名。
我可以得到前三个评论 ORDER BY comments.ratings DESC:
SELECT comments.userid, users.username, comments.comment, comments.ratings, comments.datetime, comments.record_num , content.uploader , content.anonymous
FROM comments
LEFT JOIN users ON comments.userid = users.record_num
LEFT JOIN content ON comments.content = content.record_num
WHERE comments.content = ? ORDER BY comments.ratings DESC limit 3
和
获取常规评论 ORDER BY comments.datetime DESC
SELECT comments.userid, users.username, comments.comment, comments.ratings, comments.datetime, comments.record_num , content.uploader , content.anonymous
FROM comments
LEFT JOIN users ON comments.userid = users.record_num
LEFT JOIN content ON comments.content = content.record_num
WHERE comments.content = ? ORDER BY comments.datetime DESC limit ?, ?
我尝试首先按评分向用户显示前三名评论,然后按 comments.datetime DESC 对常规评论进行排序。
现在如何将上述两个 MySQL 查询合并为一个?
最佳答案
正如另一个答案所说 - 您可以使用 union
组合结果 - 这只是意味着将两个结果连接在一起。然而,需要注意的重要一点是,您不能简单地将这两个查询直接union
在一起,因为它们使用order by
,所以我们需要将它们包装在外部查询,并使用排名变量来确保我们可以按照我们想要的顺序重建并集:
select * from (
SELECT 1 as tbl,
comments.userid,
users.username,
comments.comment,
comments.ratings,
comments.datetime,
comments.record_num,
content.uploader,
content.anonymous,
@rank := @rank + 1 as rank
FROM comments
LEFT JOIN users ON comments.userid = users.record_num
LEFT JOIN content ON comments.content = content.record_num
CROSS JOIN (select @rank := 0 ) q
WHERE comments.content = ? ORDER BY comments.ratings DESC limit 3
) q1
UNION ALL
select * from (
SELECT 2 as tbl,
comments.userid,
users.username,
comments.comment,
comments.ratings,
comments.datetime,
comments.record_num,
content.uploader,
content.anonymous,
@rank := @rank + 1 as rank
FROM comments
LEFT JOIN users ON comments.userid = users.record_num
LEFT JOIN content ON comments.content = content.record_num
CROSS JOIN (select @rank := 0 ) q
WHERE comments.content = ? ORDER BY comments.datetime DESC limit ?, ?
) q2
ORDER BY tbl asc, rank asc;
union
默认情况下是 distinct
意味着它不会重复在两个结果集中找到的行,但是也不能保证这些行将在您期望的顺序,因此需要用自己的 tbl
值标记每个表,然后按该字段排序
。
如果您确定不会有重复项,您可以使用 union all
而不是 union
关于php - 如何从同一个表中的单个 MySQL 查询中获取两组结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29475429/