我很难描述这一点,而且我很可能让它变得比它应该更难......
基本上,我有一个页面填充了针脚/帖子,用户可以对它们进行upvote或downvote。在一个查询中,我想获得一个引脚列表,但也要加入两个表来查看用户是否对它们进行了投票或投票。
表结构:
pins table
| id | title |
+------+-------------------+
1 Post 1
2 Post 2
3 Post 3
4 Post 4
user_upvotes table
| id | user_id | pin_id |
+------+-----------+----------+
1 1 2
2 2 1
3 2 3
4 2 1
user_downvotes table
| id | user_id | pin_id |
+------+-----------+----------+
1 2 2
2 1 1
3 1 3
4 1 1
这是我尝试的查询,但最终会复制页面上的引脚。
SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
这导致(注意pin_id 1重复两次):
| pin_id | title | upvote | downvote |
| 1 | Post 1 | (NULL) | 2 |
| 1 | Post 1 | (NULL) | 4 |
| 2 | Post 2 | 1 | (NULL) |
| 3 | Post 3 | (NULL) | 3 |
| 4 | Post 4 | (NULL) | (NULL) |
从这一点开始,我只检查该值是否为NULL,如果没有,我附上一个css类来表示它已被upvoted或downvoted。
基本上,我想要上面的结果,只是没有引脚被复制。如果您有更好的方法,请随时告诉我。
答案 0 :(得分:1)
添加GROUP BY
SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
GROUP BY pin_id
答案 1 :(得分:1)
这可能意味着用户已对两个相同的引脚进行了投票或投票。由于您在结果中包含投票的ID,因此您可以将不同的投票作为单独的记录。
我想你想要一个计数,或者你想要防止双重投票。 计数如下:
SELECT
pins.id AS pin_id,
title,
COUNT(user_upvotes.id) AS upvotes,
COUNT(user_downvotes.id) AS downvotes
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
GROUP BY
pins.id
现在您可以显示计数,或者只是将其显示为是或否,具体取决于它是否为> 0或不。
答案 2 :(得分:-1)
这不会有帮助吗?
SELECT pins.id AS pin_id, title, user_upvotes.id AS upvote, user_downvotes.id AS downvote
FROM pins
LEFT JOIN user_upvotes ON user_upvotes.pin_id = pins.id AND user_upvotes.user_id = 2
LEFT JOIN user_downvotes ON user_downvotes.pin_id = pins.id AND user_downvotes.user_id = 2
**GROUP BY pins.id**