【问题标题】:Unique value for one columns in SELECT JOIN MySQL querySELECT JOIN MySQL 查询中一列的唯一值
【发布时间】:2015-08-09 00:23:54
【问题描述】:

我有一个查询,用户可以使用JOIN 从两个表中提取数据。但我希望结果中的一列特定于user_id,或者如果它与user_id 不匹配,则返回null

SQL:

SELECT 
        posts.id, 
        posts.deviceID, 
        posts.type, 
        posts.title,  
        posts.time, 
        SUM(value) AS votes,
        value AS userVote, <--- THIS NEED TO BE UNIQUE TO WHAT THE USER ID IS.          
        FROM posts 
        LEFT JOIN votes 
        on (posts.id = votes.post_id)
        GROUP BY posts.id

如您所见,有value AS userVote 的SELECT 语句。该函数提供user_id 和php $_POST['user_id'] 方法,我知道如何输入这个值。这个查询让我有点困惑。

生成快照:

另外,如果这是重复的问题,请提前抱歉,但我想不出这个方法在 MySQL 查询中调用了什么,如果你能告诉我,我很感激。

更新:

目前我可以使用CASE WHEN votes.user_id = 'USERID' THEN value END AS userVote 正确获取值,多亏了一个答案,但是当有两个值时,它不会返回用户值而是null

更新截图:

【问题讨论】:

  • 带有case whenif 的列
  • @Drew 是的,查询是什么,我该如何在 join 语句中执行?我真的很感激

标签: php mysql sql


【解决方案1】:

你想要条件聚合:

SELECT p.id, p.deviceID, p.type, p.title, p.time, 
       SUM(v.value) AS votes,
       MAX(CASE WHEN p.user_id = u.user_id THEN v.value END) as userVote
FROM posts p LEFT JOIN
     votes v
     on p.id = v.post_id
GROUP BY p.id;

注意:如果用户可以多次投票,您可能需要SUM()GROUP_CONCAT(),具体取决于您希望看到的内容。

【讨论】:

  • 现场..我无法理解
  • @NSGod 。 . .实际上,您使用的 MySQL 扩展允许 SELECT 中的列不在 GROUP BY 中。如果您使用任何其他数据库,您的查询会产生语法错误,您可能自己也会偶然发现这一点。
  • @GordonLinoff 有趣,是的,但我坚持使用 MySQL。我的使用很灵活,但还不先进。 :)
  • @NSGod 。 . .您可以使用ONLY_FULL_GROUP_BY 模式将服务器设置为使用“标准”GROUP BYdev.mysql.com/doc/refman/5.6/en/…
  • @GordonLinoff 谢谢,我会阅读文档并进行更改。干杯!
【解决方案2】:
SELECT 
posts.id, 
posts.deviceID, 
posts.type, 
posts.title,  
posts.time, 
SUM(value) AS votes,
-- value AS userVote,
case when posts.user_id = votes.user_id then value end as userVote,
case when posts.user_id = votes.user_id then post.user_id else null end AS UserIDVote           
FROM posts 
LEFT JOIN votes 
on (posts.id = votes.post_id)
GROUP BY posts.id

添加了case 条件,如果两个表都有user_id 列,该条件将起作用。对于所有匹配项,您将获得user_id,否则将获得null

编辑:如果有匹配的用户 ID 时需要特定值,则必须从查询中排除值的聚合。

SELECT 
posts.id, 
posts.deviceID, 
posts.type, 
posts.title,  
posts.time,
case when posts.user_id = votes.user_id then value end as userVote,
case when posts.user_id = votes.user_id then post.user_id else null end AS UserIDVote           
FROM posts 
LEFT JOIN votes 
on posts.id = votes.post_id

【讨论】:

  • 你的意思是sum(value)select 语句中。如果是这样,您是否需要仅匹配正面的sum(value)
  • 我已经获得了总票数,但我还希望列 userVote 是 1 或 -1 或 null 基于 user_id
  • 使用'AD8EABEC-9939-4665-930E-15BB4BACEA69'等引号
  • 你不能在一个查询中同时做这两个。
  • 所以基本上我无法转到匹配 user_id 的下一个可用案例
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 2012-07-23
  • 2015-02-22
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多