MySQL ORDER BY" count(*)和2个其他参数"从另一张桌子

时间:2017-09-03 20:00:55

标签: php mysql

我一直在努力解决这个问题大约一个月。 一直在搜索和阅读很多帖子,但仍然无法弄清楚,如何使这项工作..

基本上:我有2个数据库表fun_postsfun_post_upvotes而且我想要

SELECT * 
FROM fun_posts 
ORDER BY (HOTTEST POSTS(MOST UPVOTED THIS WEEK))

这是我最新的代码,它不会起作用

SELECT * 
FROM fun_posts 
ORDER BY (SELECT count(*), image_id, date 
          FROM fun_post_upvotes 
          GROUP BY image_id 
          ORDER BY DATE(date) > (NOW() - INTERVAL 7 DAY) DESC, 
                   count(*) DESC, 
                   date DESC)

如果我将此行划分为2个不同的SELECT函数,它们就可以工作。我可以选择简单的帖子,我可以按照自己的意愿选择upvotes count。

但如果我把它们变成这样的一行,我会得到以下错误:

  

#1241 - 操作数应包含1列

编辑NR 1:

fun_postsImage fun_post_upvotesImage

我检查的答案有问题:

在此处,查看我的select功能中的帖子排序方式。 (它选择我想要的)10-> 134-> 132-> 2-> 13

Image

这里有给定的代码(它选择图像,但不是按顺序)10-> 122-> 39-> 8-> 110

Image

1 个答案:

答案 0 :(得分:4)

您可以使用联接来执行此操作

SELECT fp.*, fpu.`cnt`
FROM fun_posts fp
LEFT JOIN ( SELECT image_id, COUNT(*) AS cnt
       FROM fun_post_upvotes
       WHERE `date` > (NOW() - INTERVAL 7 day)
       GROUP BY image_id
     ) fpu ON ( fpu.image_id = fp.id )
ORDER BY fpu.cnt DESC, fp.`date` DESC, fp.`id` DESC;

它从image_id分组的fun_post_upvotes中选择一个列表并计算行数。该列表返回到主查询并匹配(LEFT JOIN)fp.id.查询将首先显示过去7天内最多投票的项目,而不是最少。如果没有找到upvotes,结果仍然会返回它们,但是在底部没有特定的顺序。

您可以按照编辑顺序,按照您喜欢的顺序获取项目。

这是sqlfiddle.com