2009-09-15 91 views
1

我有2张桌子。一个是项目,另一个是对这些项目的投票。mysql:如何INNER JOIN一个表,但限制连接1结果与最高票数或计数?

Items table has: |item_id|name|post_date 
Votes table has: |votes_id|item_id|answer|total_yes|total_no 

我想要做的是根据post_date显示所有项目并在票数表中显示答案,以HIGHEST total_yes。所以我想只显示总票数最高的投票表中的单个答案。

我尝试:

SELECT a.*, b.* FROM Items a 
INNER JOIN Votes b ON a.item_id = b.item_id 
GROUP by a.item_id 
ORDER by a.post_date DESC, b.total_yes DESC 

但是,这并不工作。

我想看到的结果是:

<item><answer><yes votes> 
Buick | Fastest | 2 yes votes 
Mercedes | Shiny | 32 yes votes 
Honda | Quick | 39 yes votes 

任何帮助表示赞赏!

+0

najmeddine的回答非常接近。但问题是如果一个项目没有投票,那么它没有显示。我想要做的是显示所有项目(即使投票表中没有投票)。 – 2009-09-15 09:10:51

回答

8
SELECT a.*, b.* 
    FROM Items a 
     LEFT JOIN Votes b on a.item_id = b.item_id 
         and b.total_yes = (select max(total_yes) 
               from Votes v 
         where v.item_id = a.item_id) 
ORDER BY a.post_date DESC, b.total_yes DESC 

N.B .:如果您针对具有相同total_yes = max的2个答案,那么您将拥有该项目的2行。

+0

太棒了!非常感谢! – 2009-09-15 08:47:44

+0

有一个问题...如果表格投票没有匹配的item_id,那么该项目不会显示。无论如何这样做,如果没有加入,它仍然会显示该项目? – 2009-09-15 09:01:07

+0

它只需要一个左连接。完成。 – manji 2009-09-15 09:18:31

0

添加LIMIT 1到查询:)结束

,将采取只有一个记录,但此刻你通过之日起第一排序,所以你会得到的最后日期最高票投了票。那是你要的吗?

如果您希望获得最高总票数,无论您需要首先进行排序。

+0

我实际上想展示一堆结果。每个结果都会显示最高的投票数。所以这是一个循环查询。谢谢! – 2009-09-15 08:35:22

+0

Scott,我希望你不要在循环中加入查询。应该有一种方法来编写查询,以便检索所需的所有结果,而无需执行循环。如果你使用循环,你会遇到同步问题,并可能加速问题。 – Fragsworth 2009-09-15 08:40:23