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

时间:2015-04-06 16:38:29

标签: 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查询从另一个表中获取此注释和用户名的注释。

我可以获得前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

定期发表评论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 ?, ?

我正在尝试做的是首先向用户显示他们评分的前3个评论,然后通过comments.datetime DESC定期发表评论。

现在我如何将两个mysql查询加入一个?

3 个答案:

答案 0 :(得分: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;
默认情况下,

uniondistinct,这意味着它不会在两个结果集中找到重复的行,但是也无法保证按照您期望的顺序返回行,因此需要使用自己的tbl值标记每个表,然后order by该字段。

如果您确定没有重复项,则可以使用union all代替union

来消除重复检查

答案 1 :(得分:1)

要回答您的问题,是的,您可以使用UNION

组合您的查询
  

我要做的是向用户展示他们的前三条评论   评论最初,然后定期评论由comments.datetime   DESC

如果您正在尝试实现类似stackoverflow评论的功能,首先显示热门评论(或带有upvotes的评论),那么我认为单独的查询 足够好即可。

如果您的查询已合并,则用户需要加载所有热门评论和常规评论。此外,对于具有UNION的大查询,某种方式难以制作或实施分页(根据我的经验,因为我仍然是编码的菜鸟)

  

Disclamer:很难但不是不可能

如果我是那个要编码该问题的人,首先我的程序会加载前三条评论,之后,会有一个“显示更多评论”和“#39;将使用AJAX发布到我的服务器的按钮,并将结果(常规注释)附加到显示的注释列表中。有了它,查询需要像现在一样分开

答案 2 :(得分:0)

要将结果集叠加到一个集合中,您需要使用" UNION" - https://dev.mysql.com/doc/refman/5.0/en/union.html