php - 在 SQL 中查找并计算重复记录并按最大计数排序

标签 php mysql sql optimization inner-join

我有两个这样的表:

第一个表名:投票

|   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'

但什么也没有。请帮助我。

最佳答案

您的查询有几个问题。首先,您有一个不需要的 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;

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

关于php - 在 SQL 中查找并计算重复记录并按最大计数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18623807/

相关文章:

php - 使用 laravel 5 在表上创建一个新的字符串列

MySql - 在Where类中使用和条件并需要很长时间才能排序

sql - 如何将 LIKE 与列名一起使用

mysql - SQL 查询错误 #1064

c# - 不将输出写入控制台的处理

PHP 生成具有特定格式的可能数字

php - 如果我永远不会结束 php 中的 session 会发生什么

php - 将这两个 MySQL 查询合并为一个

php - 从 Salesforce 复制数据 - PHP 工具包和 curl

mysql - 尝试在 Navicat 中创建关系