根据ID

时间:2018-06-19 10:46:36

标签: mysql sql join

在我的公众投票数据库中,我有以下结构的pages和pages_votes表: - 网页
page table
页面投票
enter image description here


我正在查询mysql数据库,以获得所有页面的结果,包括正面和负面投票的总和 正投票为1,反对投票为0 我的查询如下: -

SELECT pages.id, pages.title, COUNT(pv.page_id) AS `total_count`, SUM(pv.vote=1) AS `likes`, SUM(pv.vote=0) AS `dislikes` 
FROM `pages` 
LEFT JOIN `pages_votes` AS `pv` ON `pages`.`id` = `pv`.`page_id` 
GROUP BY `pages`.`id`, `pages`.`title`, `pages`.`slug`, `pages`.`image` 
ORDER BY `total_count` DESC;


结果看起来像这样(这里没问题): - enter image description here

现在我想在此结果中添加一个名为'my_vote'的新自定义列,我的投票会将我的投票(user_id = 3)显示为1或0,如果我有喜欢/不喜欢投票,如果我没有投票,则为NULL。
page_votes表中已经有一个user_id记录了哪个用户投票。如何使用它来获得ID = 10的特定用户的投票?

2 个答案:

答案 0 :(得分:3)

我建议用表别名编写查询。然后,您的问题的答案是CASE表达式:

SELECT p.id, p.title, COUNT(pv.page_id) AS total_count,
       SUM(pv.vote =1 ) AS likes, SUM(pv.vote = 0) AS dislikes,
       SUM(CASE WHEN pv.vote = 1 AND p.user_id = 3 THEN 1
                WHEN pv.vote = 0 AND p.user_id = 3 THEN 0
           END) as user_3_vote
FROM pages p LEFT JOIN 
     pages_votes pv
     ON  p.id = pv.page_id 
GROUP BY p.id, p.title
ORDER BY total_count DESC;

请注意,这使用SUM(CASE . . .)而不是SUM( <boolean expression> )。这很重要,因此您可以在没有投票时获得NULL值。

答案 1 :(得分:0)

您会在查询中考虑一个小变化吗?获得指定的输出。

SELECT pages.id, pages.title, COUNT(pv.page_id) AS `total_count`, 
SUM(case when pv.vote = 1 then 1 else 0 end) AS `likes`, 
SUM(case when pv.vote = 0 then 1 else 0 end) AS `dislikes`
FROM `pages`
LEFT JOIN `pages_votes` AS `pv`
ON `pages`.`id` = `pv`.`page_id`
GROUP BY `pages`.`id`, `pages`.`title`, `pages`.`slug`, `pages`.`image`
ORDER BY `total_count` DESC;