在mysql中编写子查询连接语句的有效方法

时间:2015-02-06 05:21:04

标签: mysql database join

我有一个reviews表,如下所示:

enter image description here

用户可以对这些评论进行投票或投票。为此,我正在维护另一个名为review_counts的表。看起来如下:

enter image description here

此处,1表示投票,而-1表示投票结果。

现在,我正在加入这两个表,这样我就可以获得总票数和总票数的评论。为实现这一点,我编写了以下查询,该工作正常。

 SELECT * FROM `reviews` as x 
 LEFT JOIN 
 (SELECT count(votes) as vote_up, review_id FROM `review_counts` WHERE votes = 1) as y ON x.review_id = y.review_id
 LEFT JOIN
 (SELECT count(votes) as vote_down, review_id FROM `review_counts` WHERE votes = -1) as z ON x.review_id = z.review_id

为此,我得到如下结果:

enter image description here 现在,问题是我在同一个桌子上使用两个JOINS来进行投票并投票否决,有没有其他方法可以使用单个连接语句获得类似的结果?

1 个答案:

答案 0 :(得分:2)

您可以使用单个LEFT JOINSUM(CASE WHEN...END)

执行此操作
CREATE TABLE reviews(
    id          INT,
    review_id   VARCHAR(10),
    review      VARCHAR(10)
)
CREATE TABLE review_counts(
    id          INT,
    review_id   VARCHAR(10),
    votes       INT
)
INSERT INTO reviews VALUES
(1, 'review1', 'Review 1'),
(2, 'review2', 'Review 2');
INSERT INTO review_counts VALUES
(1, 'Review1', 1),
(2, 'Review1', 1),
(3, 'Review1', 1),
(4, 'Review1', 1),
(5, 'Review1', 1),
(6, 'Review2', -1),
(7, 'Review2', -1),
(8, 'Review2', -1),
(9, 'Review2', -1),
(10, 'Review2', -1);

SELECT
    r.*,
    SUM(CASE WHEN c.votes = 1 THEN 1 ELSE 0 END) AS Vote_Up,
    SUM(CASE WHEN c.votes = -1 THEN 1 ELSE 0 END) AS Vote_Down
FROM reviews r
LEFT JOIN review_counts c
    ON c.review_id = r.review_id
GROUP BY r.id, r.review_id, r.review

DROP TABLE reviews
DROP TABLE review_counts

<强> RESULT

id          review_id  review     Vote_Up     Vote_Down
----------- ---------- ---------- ----------- -----------
1           review1    Review 1   5           0
2           review2    Review 2   0           5