2009-04-03 27 views
1

私は投票を行っています:各投票には多くのオプションがあり、ユーザーは投票で一度投票できます。MYSQL:複雑な質問質問

  • ID(投票のID)
  • option_id
  • USER_ID(ユーザーのID)
  • (選択したポーリングオプションのID):したがって、私は、次のフィールドでの投票 'テーブルを持っていますだからここ
  • poll_id(ポーリングのID)

は私がをやろうとしているものです:poll_idsの配列を考えると、私は、クエリは、ほとんどの各ポーリングのオプションに投票を返すようにしたいです。

ほとんどのトリックを行います...しかし、私に与え
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; 

:私は1 & 2のpoll_id年代を与えればこのように、私はほとんどの世論調査1 & 2のオプションに投票し、私は次のことを試してみましたが戻って取得したいですすべて投票オプションは、最も投票されたオプションだけでなく、各投票の対応投票を提供します。誰かがアイデアを持っているなら、本当に感謝しています。ありがとう。

+0

なぜ投票に再び参加していますか? –

+0

私はパブロの2番目の質問です。どうしてそんなことをするのか? – Welbog

+0

彼は投票ではなく世論調査に加わることを意味すると思います。 – Quassnoi

答えて

4
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) 
+0

ありがとうございました。これはうまくいった! –

+0

答えを受け入れると、それは私がとても貪欲な15ポイントを与えるでしょう! – Quassnoi

0

これを解決するには自己結合が必要ではないと思われますが、Quassnoiの答えは正しいようです。

0

クアクノーの答えになります。カウント(*)操作を使用して合計を戻し、その合計で注文して、誰が最善を尽くすかを確認するために必要なテーブルに参加する必要はありません。 GROUP BYは、あなたのケースでは、どのポーリングオプションを数えるためにどのカテゴリをカウントするかをmysqlエンジンに指示します。

0

このようなことはありますか?

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