sql >> データベース >  >> RDS >> Mysql

候補者を排除しながら投票を再配布する

    遊んでいます。

    次のように実行できる場合は、現在のデータレイアウトを使用すると思います。-

    SELECT COALESCE(IF(vote_candidate_b IN (4,3,5), NULL, vote_candidate_b),
                    IF(vote_candidate_c IN (4,3,5), NULL, vote_candidate_c),
                    IF(vote_candidate_d IN (4,3,5), NULL, vote_candidate_d),
                    IF(vote_candidate_e IN (4,3,5), NULL, vote_candidate_e),
                    IF(vote_candidate_f IN (4,3,5), NULL, vote_candidate_f)) AS vote_candidate,
                    COUNT(*)
    FROM votes
    WHERE vote_candidate_a = 4
    GROUP BY vote_candidate;
    

    これは、ファンシーパンツが答えたのとほぼ同じです。読みにくく、(データ量が多い場合)非効率になる可能性があるため、私はこれに熱心ではありません。

    私は、データを別のテーブル構造に分割する傾向があります。投票のセットごとに複数の行があり、候補ごとに1つです。システムが開発の初期段階にある場合(つまり、新しいテーブルを生成するだけの場合)、これははるかに簡単です。

    既存のデータが次のように設定されていると仮定します。-

    CREATE TABLE votes
    (
        vote_id INT NOT NULL AUTO_INCREMENT,
        vote_candidate_a INT,
        vote_candidate_b INT,
        vote_candidate_c INT,
        vote_candidate_d INT,
        vote_candidate_e INT,
        vote_candidate_f INT
    );
    
    INSERT INTO votes
    VALUES
    (NULL, 4, 1, 6, 3, 2, 5),
    (NULL, 4, 3, 1, 6, 2, 5),
    (NULL, 4, 5, 6, 2, 3, 1),
    (NULL, 4, 3, 1, 5, 6, 2);
    

    私のフォーマットは次のように生成できます:-

    CREATE TABLE vote_orders
    (
        id INT NOT NULL AUTO_INCREMENT,
        vote_id INT,
        vote_order INT,
        vote_candidate INT
    );
    
    INSERT INTO vote_orders (id, vote_id, vote_order, vote_candidate)
    SELECT NULL, vote_id, 1, vote_candidate_a FROM votes
    UNION
    SELECT NULL, vote_id, 2, vote_candidate_b FROM votes
    UNION
    SELECT NULL, vote_id, 3, vote_candidate_c FROM votes
    UNION
    SELECT NULL, vote_id, 4, vote_candidate_d FROM votes
    UNION
    SELECT NULL, vote_id, 5, vote_candidate_e FROM votes
    UNION
    SELECT NULL, vote_id, 6, vote_candidate_f FROM votes;
    

    次に、以下を使用して投票を取得できます。これは、サブクエリを使用して、まだ使用されていない最高の投票を取得し、それをデータに対して結合します。

    SELECT vote_candidate, COUNT(*)
    FROM vote_orders a
    INNER JOIN
    (
        SELECT vote_id, MIN(vote_order) AS min_vote_order
        FROM vote_orders
        WHERE vote_candidate NOT IN (4,3,5)
        GROUP BY vote_id
    ) b
    ON a.vote_id = b.vote_id
    AND a.vote_order = b.min_vote_order
    INNER JOIN
    (
        SELECT vote_id
        FROM vote_orders
        WHERE vote_candidate  = 4
        AND vote_order = 1
    ) c
    ON a.vote_id = c.vote_id
    GROUP BY vote_candidate
    

    ここでSQLフィドル:-

    http://www.sqlfiddle.com/#!2/7d48c/10

    ハイブリッドソリューション(両方の世界で最悪です!):-

    SELECT vote_candidate, COUNT(*)
    FROM 
    (
        SELECT vote_id, 1 AS vote_order, vote_candidate_a AS vote_candidate FROM votes WHERE vote_candidate_a = 4
        UNION
        SELECT vote_id, 2, vote_candidate_b FROM votes WHERE vote_candidate_a = 4
        UNION
        SELECT vote_id, 3, vote_candidate_c FROM votes WHERE vote_candidate_a = 4
        UNION
        SELECT vote_id, 4, vote_candidate_d FROM votes WHERE vote_candidate_a = 4
        UNION
        SELECT vote_id, 5, vote_candidate_e FROM votes WHERE vote_candidate_a = 4
        UNION
        SELECT vote_id, 6, vote_candidate_f FROM votes WHERE vote_candidate_a = 4
    ) a
    INNER JOIN
    (
        SELECT vote_id, MIN(vote_order) AS min_vote_order
        FROM 
        (
            SELECT vote_id, 2 AS vote_order, vote_candidate_b AS vote_candidate FROM votes
            UNION
            SELECT vote_id, 3, vote_candidate_c FROM votes
            UNION
            SELECT vote_id, 4, vote_candidate_d FROM votes
            UNION
            SELECT vote_id, 5, vote_candidate_e FROM votes
            UNION
            SELECT vote_id, 6, vote_candidate_f FROM votes
        ) a
        WHERE vote_candidate NOT IN (4,3,5)
        GROUP BY vote_id
    ) b
    ON a.vote_id = b.vote_id
    AND a.vote_order = b.min_vote_order
    GROUP BY vote_candidate;
    


    1. cURLを使用してWebサイトから特定のデータをフェッチし、phpを使用してデータベースに保存する方法

    2. SQLにおけるMySQLとSQLiteの違い

    3. 移動平均MySQLを計算しますか?

    4. SQLServerが存在しない場合は挿入