MySQL充分利用连接

MySQL充分利用连接,mysql,left-join,Mysql,Left Join,好吧,也许我想做的是不可能的,但它确实有意义 我有三个表:用户,评论和评论(评级)。在comments\u 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

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

我有三个表:
用户
评论
评论(评级
)。在
comments\u 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 ?,?
选择
c、 *,
u、 名称为authorName,
作为评级的总票数(cr.vote)
来自评论c
在u.id=c.author上左加入用户u
左连接注释\u c.id上的评级cr=cr.comment

其中c.idYes和no。我更愿意在c.id和u.id=user in question
上做另一个加入
comments\u评级的连接,但是可以通过php或任何其他用于显示结果的语言提取您需要做的简单检查。使用
GROUP\u CONCAT
获取对评论进行投票的所有ID的字符串,然后
将其分解为
数组
,以供参考

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 ?,?
选择
c、 *,
u、 名称为authorName,
金额(cr.投票)作为评级,
组CONCAT(cr.user\u id)作为用户id
来自评论c
在u.id=c.author上左加入用户u
左连接注释\u c.id上的评级cr=cr.comment

其中C.Id考虑提供适当的DDL和/或SqLFIDLE,连同期望的结果集<代码>,其中C.ID@ DigalCalCIS,这是因为当用户请求页面时,我缓存最后一个评论ID,并且我用它作为引用来显示旧的注释,这确实像这个建议。我使用的是php,它以速度相当快而著称。你为什么更愿意和其他人一起去?这是一个棘手的选择,doh!不,没那么棘手;)MySQL将几乎立即为您修复它,而php则稍慢一些。即使上述工作,去另一个加入!我担心MySQL会做很多工作,因为如果有一天记录量达到一个很高的数字,我想不会是那么快。我的主要观点是,如果我在这个表中循环一次,为什么我不提取我需要的所有数据,而不是再次打开它:/但这正是为什么你应该在MySQL中这样做!如果您编写了好的查询并添加了正确的索引,那么即使是数百万行也会在一次心跳中连接和排序。如果你有1000票在PHP中为每一条评论进行检查呢?好的,我相信。谢谢你的帮助,我真的很感激<代码>:)