Mysql如何从同一个表中的单个查询中获取2组结果?

AMB*_*AMB 7 php mysql join

我有这样的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 |
+------------+------------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

现在我可以使用像这样的INNER JOIN查询从另一个表中获取来自此用户名和用户名的注释.

我可以获得前3条评论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
Run Code Online (Sandbox Code Playgroud)

获得定期评论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 ?, ?
Run Code Online (Sandbox Code Playgroud)

我想要做的是首先通过评级向用户显示前三条评论,然后通过comments.datetime DESC定期评论.

现在我怎么能将上面两个mysql查询加入到一个?

pal*_*la_ 9

正如另一个答案所说 - 你可以结合使用结果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;
Run Code Online (Sandbox Code Playgroud)

union在默认情况下是distinct这意味着它不会重复在两组结果发现行,但也有不保证行会在你所期望的顺序返回,因此需要标注有自己的每个表tbl的值,然后order by是领域.

如果您确定没有重复项,则可以通过使用union all而不是使用来消除重复检查union