SELECT *, null AS score,
'0' AS SortOrder
FROM products
WHERE datelive = -1
AND hidden = 0
UNION
SELECT e.*, (SUM(r.a)/(COUNT(*)*1.0)+
SUM(r.b)/(COUNT(*)*1.0)+
SUM(r.c)/(COUNT(*)*1.0)+
SUM(r.d)/(COUNT(*)*1.0))/4 AS score,
'1' AS SortOrder
FROM products e
LEFT JOIN reviews r
ON r.productID = e.productID
WHERE e.hidden = 0
AND e.datelive != -1
GROUP BY e.productID
HAVING COUNT(*) >= 5
UNION
SELECT e.*, (SUM(r.a)/(COUNT(*)*1.0)+
SUM(r.b)/(COUNT(*)*1.0)+
SUM(r.c)/(COUNT(*)*1.0)+
SUM(r.d)/(COUNT(*)*1.0))/4 AS score,
'2' AS SortOrder
FROM products e
LEFT JOIN reviews r
ON r.productID = e.productID
WHERE e.hidden = 0
AND e.datelive != -1
GROUP BY e.productID
HAVING COUNT(*) < 5
ORDER BY SortOrder ASC, score DESC
这会创建一个用于在页面上显示产品的SQL对象。第一个请求获取类型datelive = -1
,第二个类型datelive != -1
但r.count(*) >= 5
,第三个类型datelive != -1
和r.count(*) < 5
。 reviews表的结构类似于如下:根据条件加入表,依靠条件
reviewID | productID | a | b | c | d | approved
-------------------------------------------------
1 1 5 4 5 5 1
2 5 3 2 5 5 0
3 2 5 5 4 3 1
... ... ... ... ... ... ...
我试图去解决它,从而r.count(*)
只关心approved = 1
类型的行,因为清点基于未经批准的评论数据并不理想。我怎样才能加入这些表格,使得总分和行数仅取决于approved = 1
?
我试着在AND r.approved = 1
中加入WHERE
条件的连接,它不会做我想要的。它确实对它进行了排序,但不再包含零评论的项目。
如果向第三个查询的WHERE添加AND R.approved = 1,会发生什么?此外,WHERE不会影响连接条件之后发生的连接条件(尽管RDBMS可能根据它进行更智能的连接),并将连续记录集中的行过滤掉。 – ydaetskcoR 2014-10-28 23:08:04
@ydaetskcoR,在第三个查询中为'WHERE'添加'AND r.approved = 1'将排除评论表中零行的所有产品。如果某个产品没有评论,那么当我喜欢它时,它不再显示。 – gator 2014-10-28 23:12:22