php - 如何从同一个表中的单个 MySQL 查询中获取两组结果?

标签 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 |
+------------+------------------+------+-----+---------+----------------+

现在我可以使用像这样的 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/

相关文章:

php - Bootstrap CDN + WP//如何编辑 '.css’

PHP多站点登录

MySQL 查询不更新数据库

mysql - 添加 OR 语句时 MySQL 查询速度变慢

sql - 在 SQL 表上使用哪种连接

php - Yii 验证码没有改变

php - 使用变量结果创建新表失败

mysql - 如果一列为空,则检查其他列

mysql - SELECT 的结果到新表中

php - 选择所有客户以及每个客户的总订单