2015-04-06 95 views
8

我有mysql的评论表,像这样。Mysql如何从同一个表中的单个查询中获取2组结果?

+------------+------------------+------+-----+---------+----------------+ 
| 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 ?, ? 

什么,我tryingf做的是向用户展示前3位的意见通过由comments.datetime DESC,然后再定期评价他们为了收视率。

现在我怎样才能将两个mysql查询合并成一个?

回答

9

- 这仅仅意味着连接两个 - 你可以使用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值标记每个表,然后order by那个字段。

如果你是一定不会有重复的,你可以通过使用union all消除重复检查,而不是union

+0

感谢您的输入什么,就是一些大的查询, – AMB

+0

@AMB他们是你的两个疑问 - 我只是格式化他们不同的稍微容易阅读。有这么走了进去 –

+0

没有太多额外的工作有没有办法,我可以显示甚至重复的值也一样,我的意思是如果只有3个评论,那么它应该由comments.ratings DESC和另一组返回6个评论,第一组订单ORDER BY comments.datetime DESC – AMB

1

要回答你的问题,是的,你可以结合使用UNION

您查询

我想要做的是向用户显示前3条评论,首先评级为 ,然后按评论顺序排序,然后按照评论顺序排序..datetime DESC

如果你正在努力实现类似的计算器,其中顶评论(或评论upvotes)首先显示的评论功能的,那么我想单独的查询是足够好。

如果将您的查询合并,则用户需要加载所有顶级常规评论。此外,它是某种很难作出或实施分页与具有UNION大查询(根据我的经验,因为我还在上编码一个小白)

Disclamer:很难,但不是不可能

如果我是谁要去代码问题之一,首先我的程序将加载前3名的意见,在此之后,有一个“显示更多评论”按钮,将张贴到我的服务器使用AJAX和结果追加(常规评论)到显示评论列表。就这样,查询必须单独像你现在有

相关问题