【问题标题】:SQL: Joining two tables with repeating count for each row?SQL:连接两个表,每行重复计数?
【发布时间】:2020-11-12 09:05:01
【问题描述】:

音乐网站数据库中的 3 个表:

用户用户ID、姓名、密码

曲目track_id,标题

user_likes_this_trackuser_id, track_id

当某个特定用户登录时。使用 PHP 和 MySQL 和 JSON API,我可以从最后一个表中检查用户喜欢什么歌曲..

SELECT * FROM `track` WHERE `id` IN (SELECT `track_id` FROM `user_likes_this_track` WHERE `user_id` = '$logged_user_id' )

我还想在客户端应用程序中显示特定歌曲的表情符号。如果他喜欢它显示喜欢的表情符号资源,如果他不喜欢这首歌显示其他资源。这个查询完成了这项工作:

SELECT COUNT(`track_id`) AS `liked` FROM `user_likes_this_track` 
        WHERE `user_id` = '$logged_user_id'
        AND `track_id` = '$track_id';
        
如果用户喜欢这首歌,

喜欢将为 1,如果不喜欢,则为 0

但是,问题是当他搜索一个包含他可能喜欢或不喜欢的曲目的搜索过滤列表时。

用户的角度,我试图获得track_idtrack_title的组合从搜索结果甚至所有曲目中获取类似:

track_id, title,  liked
1       ,'ZHU...' , 1         // he likes this song
2       ,'Sia...' , 1         // he likes SIA too
3       ,'other.' , 0         // 0 occurrence in user_likes_this_track
...

是否可以在不更改和添加额外表的情况下为该解决方案找到一个神奇的查询?

感谢大家的宝贵时间。

【问题讨论】:

  • 您的意思是您只想要用户以一种或另一种方式表达偏好的曲目列表吗?那肯定是select * from user_likes_this_track left join track on track_id = id where user_id = your user 或类似的吗?这将给出他们喜欢或不喜欢的所有曲目。
  • @droopsnoot 是的,还有他不喜欢的那些都显示偏好状态..但是你的代码只显示偏好..
  • 我很感激,谢谢很多人的回答都有效.. 但我看到两种方法都使用两种状态方法.. 这不是 count() 函数吗?
  • 我想我误解了“喜欢”表的结构。出于某种原因,我决定如果用户喜欢该曲目,它会写一个“1”,如果他们不喜欢该曲目,它会写一个“0”,任何不在表格中的都是用户拥有的没有意见。您的结构似乎是,如果用户在“喜欢”表中有一个条目,他们喜欢该曲目,但如果他们没有,则您假设相反。我上面的查询不会为此做任何事情,你说得很对。我必须更详细地阅读这些内容。

标签: php mysql sql join count


【解决方案1】:

你可以使用类似的东西

$sql = "SELECT track_id, title, 1 as liked from track where track_id NOT IN (SELECT track_id from user_likes_this_track where user_id = '$logged_user_id') UNION SELECT track_id, title, 0 as liked from track where track_id IN (SELECT track_id from user_likes_this_track where user_id = '$logged_user_id')";

【讨论】:

  • 嗯,这既棘手又简单.. 我认为 count() 将一直​​是解决方案的一部分。但它正在被逆转 NOT IN 应该在 0 部分.. 而 IN 在 1
【解决方案2】:
SELECT 
    a.track_id, 
    a.title, 
    CASE 
        WHEN b.track_id IS NULL THEN 0 
        ELSE 1 
    END
FROM track a
LEFT JOIN user_likes_this_track b ON b.track_id = a.track_id
    AND b.user_id = :userID
;

【讨论】:

  • 我尝试了您的代码 3 次,但仍然出现错误,然后记得 'like' 是保留字.. 然后它起作用了我不知道 'CASE' 'END' 是什么..
  • 已将 like 更改为 b
  • 谢谢伙计,我以为我会永远被困住。我想知道有没有办法用 count()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 2023-01-10
  • 1970-01-01
  • 2015-12-06
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多