MySQL充分利用了连接

时间:2014-01-19 22:48:02

标签: mysql left-join

好吧也许我想做的事情是不可能的,但它确实有意义。

我有3个表:userscommentscomments_ratings。在comments_ratings cr中,对于他们投票的每条评论,我都会保留评论的ID,用户的ID以及他们给出的投票。我现在要做的是弄清楚用户是否对查询返回的每条评论进行了投票。

SELECT
    c.*,
    u.name as authorName,
    SUM(cr.vote) AS rating

FROM comments c 
    LEFT JOIN users u ON u.id = c.author 
    LEFT JOIN comments_ratings cr ON c.id = cr.comment

WHERE c.id <= ? 
GROUP BY c.id 
ORDER BY c.id DESC
LIMIT ?,?

因此,这会将每个评论作为单个行(令人难以置信)返回,但是为了确定当前用户是否已经对每个评论进行了投票,而不是向cr添加另一个联接,我可以以某种方式使用我已经有SUM票了吗?

换句话说,我是否可以获得一个额外的列,该列是否支持用户x是否已对此特定评论(行)进行投票,而不添加第三个联接?

1 个答案:

答案 0 :(得分:1)

是和否。我更愿意与comments_ratings on c.id AND u.id = user in question进行另一次联接,但是可以使用php或用于显示结果的任何其他语言来提取您需要进行简单检查的内容。使用GROUP_CONCAT获取已对评论投票的所有ID字符串,然后explode将其添加到array以供参考。

SELECT
    c.*,
    u.name as authorName,
    SUM(cr.vote) AS rating,
    GROUP_CONCAT(cr.user_id) AS user_ids

FROM comments c 
    LEFT JOIN users u ON u.id = c.author 
    LEFT JOIN comments_ratings cr ON c.id = cr.comment 
WHERE c.id <= ? 
GROUP BY c.id 
ORDER BY c.id DESC
LIMIT ?,?