Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在求和之前检查值是否在结果集中_Mysql - Fatal编程技术网

MySQL在求和之前检查值是否在结果集中

MySQL在求和之前检查值是否在结果集中,mysql,Mysql,我有一个评论评分表,当我获取评论时,我也获取评分,我还希望能够显示登录用户已经投票的评论。这就是我现在正在做的 SELECT c.id, c.text, c.datetime, c.author, u.email AS author_name, SUM(cr.vote) AS rating, cr2.vote AS voted FROM comments c LEFT JOIN users u ON u.id = c.author LEFT JOIN comments_rat

我有一个评论评分表,当我获取评论时,我也获取评分,我还希望能够显示登录用户已经投票的评论。这就是我现在正在做的

SELECT 
c.id, 
c.text, 
c.datetime, 
c.author, 
u.email AS author_name, 
SUM(cr.vote) AS rating, 
cr2.vote AS voted

FROM comments c 
LEFT JOIN users u ON u.id = c.author 
LEFT JOIN comments_ratings cr ON c.id = cr.comment 
LEFT JOIN comments_ratings cr2 ON c.id = cr2.comment AND cr2.user = :logged_user_id 

GROUP BY c.id ORDER BY c.id DESC
但我不喜欢在同一个表上执行第二次联接的方式。我知道这是非常有效的,但是如果我可以从第一个连接中获得我想要的信息,那么为什么要执行第二个连接呢

在执行聚合函数之前,是否可以确定表
comments\u ratings cr
上是否存在列
user
等于
:logged\u user\u id
的行


附言:如果有人能想出一个更好的标题,人们可以在将来找到,我也很感激。

你可以通过条件聚合做你想做的事:

SELECT c.id, c.text, c.datetime, c.author, u.email AS author_name, 
       SUM(cr.vote) AS rating, 
       MAX(cr.user = :logged_user_id) as voted
FROM comments c LEFT JOIN
     users u
     ON u.id = c.author LEFT JOIN
     comments_ratings cr
     ON c.id = cr.comment 
GROUP BY c.id
ORDER BY c.id DESC;

您可以使用条件聚合执行您想要的操作:

SELECT c.id, c.text, c.datetime, c.author, u.email AS author_name, 
       SUM(cr.vote) AS rating, 
       MAX(cr.user = :logged_user_id) as voted
FROM comments c LEFT JOIN
     users u
     ON u.id = c.author LEFT JOIN
     comments_ratings cr
     ON c.id = cr.comment 
GROUP BY c.id
ORDER BY c.id DESC;

您可以使用条件聚合执行您想要的操作:

SELECT c.id, c.text, c.datetime, c.author, u.email AS author_name, 
       SUM(cr.vote) AS rating, 
       MAX(cr.user = :logged_user_id) as voted
FROM comments c LEFT JOIN
     users u
     ON u.id = c.author LEFT JOIN
     comments_ratings cr
     ON c.id = cr.comment 
GROUP BY c.id
ORDER BY c.id DESC;

您可以使用条件聚合执行您想要的操作:

SELECT c.id, c.text, c.datetime, c.author, u.email AS author_name, 
       SUM(cr.vote) AS rating, 
       MAX(cr.user = :logged_user_id) as voted
FROM comments c LEFT JOIN
     users u
     ON u.id = c.author LEFT JOIN
     comments_ratings cr
     ON c.id = cr.comment 
GROUP BY c.id
ORDER BY c.id DESC;


虽然代码可以工作,但我很难弄清楚它是如何工作的。如果它应该得到与条件匹配的所有记录的最大值
cr.user=logged\u id
,那么它不应该等于id本身吗?我缺少什么?表达式
cr.user=:logged\u user\u id
是一个布尔表达式。在数字上下文中,如果为真,则值为1,如果为假,则值为0。如果表达式为真,则
max()
将返回1——也就是说,如果存在匹配项。因此,如果我想获取投票的值,而不是仅获取1或0,您是否会说类似这样的内容是可以的,并且不会大大减慢查询速度--
max(如果(cr.user=:logged\u user\u id,cr.vote,NULL))投票结果
?@php\u nub\u qq。我会使用
case
,但是是的,这是正确的逻辑。@php\u nub\u qq
case
是创建条件表达式的ANSI标准方法
if()
是MySQL特有的扩展。虽然代码可以工作,但我很难弄清楚它是如何工作的。如果它应该得到与条件匹配的所有记录的最大值
cr.user=logged\u id
,那么它不应该等于id本身吗?我缺少什么?表达式
cr.user=:logged\u user\u id
是一个布尔表达式。在数字上下文中,如果为真,则值为1,如果为假,则值为0。如果表达式为真,则
max()
将返回1——也就是说,如果存在匹配项。因此,如果我想获取投票的值,而不是仅获取1或0,您是否会说类似这样的内容是可以的,并且不会大大减慢查询速度--
max(如果(cr.user=:logged\u user\u id,cr.vote,NULL))投票结果
?@php\u nub\u qq。我会使用
case
,但是是的,这是正确的逻辑。@php\u nub\u qq
case
是创建条件表达式的ANSI标准方法
if()
是MySQL特有的扩展。虽然代码可以工作,但我很难弄清楚它是如何工作的。如果它应该得到与条件匹配的所有记录的最大值
cr.user=logged\u id
,那么它不应该等于id本身吗?我缺少什么?表达式
cr.user=:logged\u user\u id
是一个布尔表达式。在数字上下文中,如果为真,则值为1,如果为假,则值为0。如果表达式为真,则
max()
将返回1——也就是说,如果存在匹配项。因此,如果我想获取投票的值,而不是仅获取1或0,您是否会说类似这样的内容是可以的,并且不会大大减慢查询速度--
max(如果(cr.user=:logged\u user\u id,cr.vote,NULL))投票结果
?@php\u nub\u qq。我会使用
case
,但是是的,这是正确的逻辑。@php\u nub\u qq
case
是创建条件表达式的ANSI标准方法
if()
是MySQL特有的扩展。虽然代码可以工作,但我很难弄清楚它是如何工作的。如果它应该得到与条件匹配的所有记录的最大值
cr.user=logged\u id
,那么它不应该等于id本身吗?我缺少什么?表达式
cr.user=:logged\u user\u id
是一个布尔表达式。在数字上下文中,如果为真,则值为1,如果为假,则值为0。如果表达式为真,则
max()
将返回1——也就是说,如果存在匹配项。因此,如果我想获取投票的值,而不是仅获取1或0,您是否会说类似这样的内容是可以的,并且不会大大减慢查询速度--
max(如果(cr.user=:logged\u user\u id,cr.vote,NULL))投票结果
?@php\u nub\u qq。我会使用
case
,但是是的,这是正确的逻辑。@php\u nub\u qq
case
是创建条件表达式的ANSI标准方法
if()
是特定于MySQL的扩展。