2

我有两个这样的表:

第一个表名:

|   type   |     item_id     |   user_id   |
""""""""""""""""""""""""""""""""""""""""
|   like    |       45       |    james    |
|   like    |       45       |    George   |
|  dislike  |       32       |     Paul    |

第二个表名:项目

|    item_id     | item_name |
""""""""""""""""""""""""""""""
|       32       |     USB   |
|       45       |     TV    |
|       57       |     Game  |

我想根据他们拥有的票数按顺序显示这些项目。像这样的东西:

 TV    - >   2
 USB   - >   1
 Game  - >   0

我尝试这样的事情:

SELECT items.item_name
FROM items INNER JOIN (
    SELECT item_id,COUNT(item_id) as vote
    FROM votes 
    HAVING COUNT(item_id) > 1
    ORDER BY COUNT(item_id) DESC
) AS votes ON votes.item_id= items.item_id 
WHERE items.item_id= 'item_id'

但什么都没有。请帮我。

4

3 回答 3

1

您的查询有几个问题。首先,您有一个where不需要的子句,并且可能会过滤掉所有内容。其次,您有一个having也过滤掉项目的子句。

如果你想得到所有的项目,按票数排序,你还需要一个left outer join,因为有些项目可能没有票:

SELECT items.item_name
FROM items LEFT OUTER JOIN
     (SELECT item_id, COUNT(item_id) as vote
      FROM votes 
      HAVING COUNT(item_id) > 1
      ORDER BY COUNT(item_id) DESC
     ) AS votes
    ON votes.item_id = items.item_id
ORDER BY coalesce(votes.vote, 0) desc;

最后,你说“投票”,不区分喜欢和不喜欢。我认为这是故意的。

于 2013-09-04T21:12:12.850 回答
0

使用 GROUP BY 将允许您对连接的表数据使用聚合函数,而无需子查询。

SELECT items.item_name, COUNT(votes.item_id) as count
FROM items LEFT JOIN votes on items.item_id = votes.item_id
GROUP BY items.item_id
ORDER BY count DESC
于 2013-09-04T21:19:32.383 回答
0
SELECT `items`.`item_name`, IFNULL(COUNT(`votes`.`item_id`),0) AS `voting` FROM `votes`
LEFT OUTER JOIN `items` ON `items`.`item_id` = `votes`.`item_id`
GROUP BY `items`.`item_id`
ORDER BY `voting` DESC;
于 2013-09-04T21:25:40.477 回答