我有两个表resource (id, name, ...)
和user_favorites(user_id, resource_id)
,它们具有来自资源表的外键resource_id
。
我有一种情况需要检查资源表中user_favorites表中特定的user_id是否有任何记录到user_favorites表中,并相应地设置一个标志true或false。
这是我可以提出的最后一个查询
SELECT distinct resources.*,
(CASE WHEN user_favorites.user_id='1' then 'TRUE' ELSE 'FALSE' END) as favorite,
user_favorites.user_id
FROM resources LEFT JOIN
user_favorites
ON resources.id = user_favorites.resource_id
但是,我希望能够保留这些资源。对于当前查询,当还存在其他用户ID的记录时,它将记录为false。
解决此问题的最佳方法是什么?
答案 0 :(得分:2)
您可以在select
中使用表达式逻辑。在MySQL中,您甚至不需要case
:
SELECT r.*, 1 as user_id,
(EXISTS (SELECT 1
FROM user_favorites uf
WHERE r.id = ur.resource_id AND
ur.user_id = 1
)
) as flag
FROM resources r ;
答案 1 :(得分:0)
使用此
SELECT r.* , IFNULL(ur.totalUser, 0) AS totalUser FROM `resource` r LEFT JOIN ( SELECT resource_id , COUNT(user_id) AS totalUser FROM `user_favourites` GROUP BY resource_id ) AS ur ON ur.resource_id = r.`id`