简单地说,查询的目的是根据它的分数列出所有的帖子,根据日期、视图和评分的计算分数来计算。
查询的问题是,它只给出1行结果,而不是显示所有的帖子。
我认为问题在于使用MAX()和MIN()而不将其与用于获取评级和视图之和的左侧联接查询分离。
MCVE http://sqlfiddle.com/#!9/70d1ec/1
SELECT
p.id
, p.date
, p.title
, r.module
, r.module_id
, IFNULL(v.total_views,0) AS views
, r.total_rating AS rating
#the following formula calculates the Score 10*(MAX(points)-(points))/(MAX(points)-MIN(points))
, round((round(10-(((PD.MaxDate-p.date)/(PD.MaxDate-PD.MinDate))*10), 3) + round(10-(((MAX(v.total_views)-v.total_views)/(MAX(v.total_views)-MIN(v.total_views)))*10), 3) + round(10-(((MAX(r.total_rating)-r.total_rating)/(MAX(r.total_rating)-MIN(r.total_rating)))*10), 3))/3, 3) AS Score
FROM posts p
LEFT JOIN ( SELECT ra.module_id
, ra.module AS module
, SUM(ra.ilike) AS total_rating
FROM rates ra
WHERE ra.module = 'posts'
GROUP
BY ra.module_id
) r ON r.module_id = p.id
LEFT JOIN ( SELECT pv.post_id
, SUM(1) AS total_views
FROM posts_views pv
GROUP
BY pv.post_id
) v ON v.post_id = p.id
JOIN (SELECT MIN(date) AS MinDate, MAX(date) AS MaxDate FROM posts) PD
ORDER BY Score DESC发布于 2019-03-07 09:40:36
由于SELECT子句中有聚合函数,所以需要指定将它们应用于哪些组。如果你加上:
GROUP BY p.id
, p.date
, p.title
, v.total_views
, r.total_rating
, r.module
, r.module_id在查询ORDER之前,您将得到每个这样的组1行。
如果没有GROUP BY子句,MySQL将随机为您选择1行。在较早的MySQL版本中,这是一个众所周知的错误。
https://dba.stackexchange.com/questions/231538
复制相似问题