Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
Php 如何形成此sql查询以检查多个特定值而不导致重复?_Php_Mysql_Sql - Fatal编程技术网

Php 如何形成此sql查询以检查多个特定值而不导致重复?

Php 如何形成此sql查询以检查多个特定值而不导致重复?,php,mysql,sql,Php,Mysql,Sql,我的下表中有这些列:喜欢的注释,喜欢的用户,值 我建立了一个网络 这是我使用的查询的一部分: SELECT the_comment_liked, COUNT(CASE WHEN value = '1' then '1' ELSE NULL END) AS tot_like, COUNT(CASE WHEN value = '2' then '1' ELSE NULL END) AS tot_dis, GROUP_CONCAT(user_who_liked) AS user

我的下表中有这些列:
喜欢的注释
喜欢的用户

我建立了一个网络

这是我使用的查询的一部分:

SELECT the_comment_liked,
    COUNT(CASE WHEN value = '1' then '1' ELSE NULL END) AS tot_like,
    COUNT(CASE WHEN value = '2' then '1' ELSE NULL END) AS tot_dis,
    GROUP_CONCAT(user_who_liked) AS user_who_liked
FROM like_dislike_comm
GROUP BY the_comment_liked
现在,我执行
PHP
检查,查看用户是否喜欢这样:

 if (strpos($r_com['user_who_liked'] ,$_SESSION["currentUser"]) !== false){//set a variable}
 //$_SESSION["currentUser"] (this stores the id of the current logged user)
如果返回true,则我将一个类设置为一个变量,以突出显示“喜欢”或“不喜欢”按钮,问题是我还必须检查该值,以了解它是喜欢还是不喜欢,例如:

 if (strpos($r_com['user_who_liked'] ,$_SESSION["currentUser"]) !== false && $r_com['value'] === 1){}
MAX(CASE WHEN user_who_liked = 118 THEN value ELSE NULL END) AS value_of_current_user
现在我也可以通过选择值来实现这一点,但这会产生重复。 我如何形成查询,以便不仅检查用户id是否存在,还检查值、喜欢还是不喜欢?或者,我可以用什么其他方式执行这样的检查

我需要将所有内容分组,以便在评论上显示喜欢和不喜欢的总数,同时,我需要让每个喜欢的
用户检查
值是
1
(喜欢)还是
2
(不喜欢)因此,我可以在每条评论上突出显示“喜欢”或“不喜欢”按钮,以便登录用户看到他喜欢或不喜欢的内容。我也不确定使用
GROUP\u CONCAT(喜欢的用户)
是正确的方法


Mysql版本是5.7.14

除非我误解了什么,否则每次运行此查询时,很可能只有一个用户(登录的用户)使用此版本

如果是这样的话,那么让您的SQL不能为您提供更多帮助是非常低效的

下面的解决方案是为用户118硬编码的。您的PHP应该在您看到的地方插入此参数,或者,您可以将此代码转换为以用户为参数的MySQL存储过程

输出显示所有评论、总喜欢、总不喜欢以及该用户的投票结果(1=喜欢,2=不喜欢,null=不投票)

这将返回以下结果集(同样,这是为用户118硬编码的):


除非我误解了什么,否则每次运行此查询时,可能只有一个用户(登录的用户)使用此查询

如果是这样的话,那么让您的SQL不能为您提供更多帮助是非常低效的

下面的解决方案是为用户118硬编码的。您的PHP应该在您看到的地方插入此参数,或者,您可以将此代码转换为以用户为参数的MySQL存储过程

输出显示所有评论、总喜欢、总不喜欢以及该用户的投票结果(1=喜欢,2=不喜欢,null=不投票)

这将返回以下结果集(同样,这是为用户118硬编码的):


您已经知道如何进行条件聚合(
COUNT(CASE..)
)。要在每条注释中查找当前用户的
,只需再添加一条即可。假设当前用户的ID为
118
,它将类似于:

 if (strpos($r_com['user_who_liked'] ,$_SESSION["currentUser"]) !== false && $r_com['value'] === 1){}
MAX(CASE WHEN user_who_liked = 118 THEN value ELSE NULL END) AS value_of_current_user
在这里使用
MAX
MIN
并不重要,因为应该只有一个值。您甚至可以使用
GROUP\u CONCAT

请注意,
NULL
ELSE
案例的默认值,因此您可以忽略它:

MAX(CASE WHEN user_who_liked = 118 THEN value END) AS value_of_current_user
你也可以写得短一点:

MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
因此,您的最终查询可能是:

SELECT the_comment_liked,
    COUNT(CASE value WHEN 1 then 1 END) AS tot_like,
    COUNT(CASE value WHEN 2 then 1 END) AS tot_dis,
    GROUP_CONCAT(user_who_liked) AS user_who_liked,
    MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
FROM like_dislike_comm
GROUP BY the_comment_liked

如果您还想将ID列表分为喜欢的
用户和不喜欢的
用户,您也可以对
组使用条件聚合:

SELECT the_comment_liked,
    COUNT(CASE value WHEN 1 then 1 END) AS tot_like,
    COUNT(CASE value WHEN 2 then 1 END) AS tot_dis,
    GROUP_CONCAT(CASE value WHEN 1 THEN user_who_liked END) AS user_who_liked,
    GROUP_CONCAT(CASE value WHEN 2 THEN user_who_liked END) AS user_who_disliked,
    MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
FROM like_dislike_comm
GROUP BY the_comment_liked

您已经知道如何进行条件聚合(
COUNT(CASE..)
)。要在每条注释中查找当前用户的
,只需再添加一条即可。假设当前用户的ID为
118
,它将类似于:

 if (strpos($r_com['user_who_liked'] ,$_SESSION["currentUser"]) !== false && $r_com['value'] === 1){}
MAX(CASE WHEN user_who_liked = 118 THEN value ELSE NULL END) AS value_of_current_user
在这里使用
MAX
MIN
并不重要,因为应该只有一个值。您甚至可以使用
GROUP\u CONCAT

请注意,
NULL
ELSE
案例的默认值,因此您可以忽略它:

MAX(CASE WHEN user_who_liked = 118 THEN value END) AS value_of_current_user
你也可以写得短一点:

MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
因此,您的最终查询可能是:

SELECT the_comment_liked,
    COUNT(CASE value WHEN 1 then 1 END) AS tot_like,
    COUNT(CASE value WHEN 2 then 1 END) AS tot_dis,
    GROUP_CONCAT(user_who_liked) AS user_who_liked,
    MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
FROM like_dislike_comm
GROUP BY the_comment_liked

如果您还想将ID列表分为喜欢的
用户和不喜欢的
用户,您也可以对
组使用条件聚合:

SELECT the_comment_liked,
    COUNT(CASE value WHEN 1 then 1 END) AS tot_like,
    COUNT(CASE value WHEN 2 then 1 END) AS tot_dis,
    GROUP_CONCAT(CASE value WHEN 1 THEN user_who_liked END) AS user_who_liked,
    GROUP_CONCAT(CASE value WHEN 2 THEN user_who_liked END) AS user_who_disliked,
    MAX(CASE user_who_liked WHEN 118 THEN value END) AS value_of_current_user
FROM like_dislike_comm
GROUP BY the_comment_liked

不确定要检查什么。你需要检查用户是否喜欢某样东西吗?@clinomaniac是的,当用户喜欢或不喜欢我将他的id插入数据库时,1表示喜欢,2表示不喜欢,然后我需要检查
,看看是哪一个,这样我就可以“着色”喜欢或不喜欢按钮,但由于所有内容都是分组的,我不知道如何检查登录的用户做了什么(喜欢还是不喜欢),您能否将您期望从查询中看到的内容显示为输出?除了user_id,您还需要向查询传递什么?@clinomaniac我不确定,我需要让每个喜欢或不喜欢的用户检查
,但由于所有内容都是分组的,我不知道什么值属于哪个用户。我使用了
GROUP\u CONCAT(user\u who\u like)
来查看用户是否做了什么,但我不确定这是正确的方法,我需要确切地知道这是
1
还是
2
。你想检查什么?我还不清楚
我需要让每个喜欢或不喜欢的用户检查表中数据的值
。每个用户都可以使用该值<代码>我需要确切知道它是1还是2
。什么是
it
?不确定要检查什么。你需要检查用户是否喜欢某样东西吗?@clinomaniac是的,当用户喜欢或不喜欢我将他的id插入数据库时,1表示喜欢,2表示不喜欢,然后我需要检查
,看看是哪一个,这样我就可以“着色”喜欢或不喜欢按钮,但是因为所有东西都是分组的,我不知道如何检查登录的用户做了什么(喜欢还是不喜欢),你能做什么