【问题标题】:MYSQL: Complex Query QuestionMYSQL:复杂查询问题
【发布时间】:2009-04-03 18:03:36
【问题描述】:

我正在使用民意调查:每个民意调查都有很多选项,用户可以在民意调查中投票一次。因此,我有一个包含以下字段的“投票”表:

  • id(投票的id)
  • option_id(所选投票选项的 ID)
  • user_id(用户ID)
  • poll_id(投票ID)

这就是我想要做的:给定一个 poll_ids 数组,我想让一个查询返回每个投票中投票最多的选项。因此,如果我给出 1 和 2 的 poll_id,我想取回投票 1 和 2 的投票最多的选项。我尝试了以下方法:

SELECT
   t1.poll_id,
   t1.option_id,
   count(t1.option_id) AS num_votes,
   t2.option_id AS user_vote 
FROM 
   votes AS t1 
JOIN 
   votes AS t2 
ON 
   t1.id = t2.id
WHERE 
   t1.poll_id IN (30,40)
GROUP BY
   t1.option_id;

这几乎可以解决问题...但为我提供了所有个投票选项,并为提供的每个投票提供相应的投票,而不仅仅是投票最多的选项。如果有人有任何想法,我将不胜感激。谢谢。

【问题讨论】:

  • 你为什么又加入了投票?
  • 我同意 Pablo 的问题。你为什么这样做?
  • 我认为他的意思是参加投票,而不是投票。

标签: mysql complexity-theory self-join


【解决方案1】:
SELECT  (
        SELECT  option_id
        FROM    votes v
        WHERE   v.poll_id = p.id
        GROUP BY
                option_id
        ORDER BY
                COUNT(*) DESC
        LIMIT 1
        ) cnt
FROM    polls p
WHERE   p.id IN (1, 2)

【讨论】:

  • 接受这个答案,它会给我15个我非常贪婪的代表点!
【解决方案2】:

我认为您不需要自我加入来解决此问题,但 Quassnoi 的回答似乎是正确的。

【讨论】:

    【解决方案3】:

    Quassnoi 的回答会做到这一点。您不需要加入表格,只需使用 count(*) 操作返回总和,然后按该总和排序,看看谁做得最好。 GROUP BY 告诉 mysql 引擎要计算哪些类别,在您的情况下计算不同的轮询选项。

    【讨论】:

      【解决方案4】:

      这样可以吗?

      SELECT count({$row['k_id']}) as k_page 
      FROM keywords_relations 
      WHERE k_id = '{$row['k_id']}' AND percent > '{$row['percent']}' 
      ORDER BY DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        相关资源
        最近更新 更多