Php 在SQL&;中查找并计数重复记录;按最大计数排序

Php 在SQL&;中查找并计数重复记录;按最大计数排序,php,mysql,sql,optimization,inner-join,Php,Mysql,Sql,Optimization,Inner Join,我有两张这样的桌子: 第一个表名:投票 第二个表名:项目 我想按顺序显示项目,这取决于它们拥有的票数。 大概是这样的: 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) >

我有两张这样的桌子:

第一个表名:投票

第二个表名:项目

我想按顺序显示项目,这取决于它们拥有的票数。 大概是这样的:

 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'
我试着这样做:

 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
子句,它也会过滤掉项目

如果您想获得按投票数排序的所有项目,还需要一个
左外部联接
,因为某些项目可能没有投票权:

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;

最后,你说的是“投票”,不区分好恶。我认为这是有意的。

使用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

回答得好。对于+1,您能解释一下它的主要功能吗?例如,
IFNULL()
做什么?左外部联接将对没有投票权的项生成Null。因此,IFNULL确保如果生成null值,它将其输出为0。这里,括号中的SELECT只输出一条记录。谢谢你的帮助!!!;)这在SQL测试中的phpMyAdmin中起作用,但在我的网站中不起作用:/您接受的答案是它的副本,因此它应该同样起作用。唯一的区别是他们在中添加了一个不必要的IFNULL函数。实际上,在他们的查询中,IFNULL是必需的,因为他们使用的是外部联接。我们正在使用内部联接,因此没有必要这样做。
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;