查询以获取帖子以及用户是否已投票支持该帖子

时间:2012-12-12 22:09:42

标签: php mysql sql

我很难描述这一点,而且我很可能让它变得比它应该更难......

基本上,我有一个页面填充了针脚/帖子,用户可以对它们进行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。

基本上,我想要上面的结果,只是没有引脚被复制。如果您有更好的方法,请随时告诉我。

3 个答案:

答案 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**