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