我在Laravel有一个画廊应用程序。我有桌面用户,照片和喜欢。
users
--id
--name
--email
photos
--id
--user_id
--name
--likes
--created_at
likes
--id
--user_id
--photo_id
我将照片分页为5。
SELECT * FROM `photos` order by created_at desc limit 0,5
我如何编写查询以检查当前用户是否喜欢这些照片而不为每张照片单独查询?
答案 0 :(得分:3)
使用JOIN
Syntax。并IF()
Control Flow Function获得明确的输出。
如果您确定likes
中表user_id
中的记录是唯一的,那么这就足够了:
SELECT `photos`.*, IF(`likes`.`id` IS NULL, 'no', 'yes') as `he_likes_it`
FROM `photos`
LEFT JOIN `likes` on `likes`.`photo_id` = `photos`.`id` AND `likes`.`user_id` = 123
ORDER BY `photos`.`created_at` DESC
LIMIT 0,5
如果您不确定表likes
中的记录是user_id
唯一的,那么您需要对结果集进行分组,以避免相乘的条目,并使用聚合函数,例如COUNT()
:
SELECT `photos`.*, IF(COUNT(`likes`.`id`) > 0, 'yes', 'no') as `he_likes_it`
FROM `photos`
LEFT JOIN `likes` on `likes`.`photo_id` = `photos`.`id` AND `likes`.`user_id` = 123
GROUP BY `photos`.`id`
ORDER BY `photos`.`created_at` DESC
LIMIT 0,5
答案 1 :(得分:1)
你需要做加入
SELECT photos.*, count(photos.id) as likes_count FROM `likes`
LEFT JOIN `photos` ON likes.photo_id = photos.id
GROUP BY likes.photo_id
WHERE photos.user_id = 12345