sql >> Database teknologi >  >> RDS >> Mysql

Omfordel stemmer, mens du eliminerer kandidater

Har haft et skuespil.

Jeg tror, ​​at bruge dit nuværende layout af data, hvis det kunne gøres som:-

SELECT COALESCE(IF(stemmekandidat_b IN (4,3,5), NULL, stemmekandidat_b), HVIS(stemmekandidat_c IN (4,3,5), NULL, stemmekandidat_c), HVIS(stemmekandidat_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 votesWHERE vote_candidate_a =4GROUP BY vote_candidate;

Dette er stort set som fancypants har svaret på. Jeg er ikke opsat på dette, da det ikke virker let at læse og (hvis mængden af ​​data er stor) sandsynligvis vil være ineffektivt.

Jeg ville være mere tilbøjelig til at opdele dataene i en anden tabelstruktur med flere rækker pr. stemmesæt, en pr. kandidat. Dette ville være meget nemmere at gøre, hvis systemet er i de tidlige udviklingsstadier (dvs. du genererer bare de nye tabeller).

Forudsat at dine eksisterende data blev sat op som følger:-

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, 6S,(NULL stemmer, 2S, , 5),(NULL, 4, 3, 1, 6, 2, 5),(NULL, 4, 5, 6, 2, 3, 1),(NULL, 4, 3, 1, 5, 6, 2 ); 

mit format kunne genereres som følger:-

CREATE TABLE vote_orders( id INT IKKE 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, SELECT NULL votes,UNIONa F vote_id, 2, vote_candidate_b FROM votesUNIONSELECT NULL, vote_id, 3, vote_candidate_c FROM votesUNIONSELECT NULL, vote_id, 4, vote_candidate_d FROM votesUNIONSELECT NULL, vote_id, 5, vote_candidate_e FROM votes, NULL_SELECTid, votesUNION_SELECTid, vote_andic;

Du kan så blot bruge følgende for at få stemmerne. Dette bruger en underforespørgsel til at få den højeste stemme, der ikke allerede er blevet brugt, og sætter den derefter sammen med dataene.

SELECT vote_candidate, COUNT(*)FROM vote_orders aINNER JOIN( SELECT vote_id, MIN(vote_order) AS min_vote_order FROM vote_orders WHERE vote_candidate IKKE I (4,3,5) GROUP BY vote_id) bON a.vote_id =b .vote_idAND a.vote_order =b.min_vote_orderINNER JOIN( SELECT vote_id FROM vote_orders WHERE vote_candidate =4 OG vote_order =1) cON a.vote_id =c.vote_idGROUP BY vote_candidate 

SQL violin her:-

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

En hybridløsning (det værste af begge verdener!):-

SELECT vote_candidate, COUNT(*)FROM ( SELECT vote_id, 1 AS vote_order, vote_candidate_a AS vote_candidate FROM stemmer WHERE vote_candidate_a =4 UNION SELECT vote_id, 2, vote_candidate_b FROM stemmer WHERE vote_candidate_a, UNION =vote_candidate_a, UNION vote_candidate_c FROM votes WHERE vote_candidate_a =4 UNION SELECT vote_id, 4, vote_candidate_d FROM stemmer WHERE vote_candidate_a =4 UNION SELECT vote_id, 5, vote_candidate_e FROM stemmer WHERE vote_candidate_a =4 UNION_SELECT_voices a =4 UNION_SELECT votes, 4 UNION_SELECT stemmer 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 stemmer UNION SELECT vote_id, 3, vote_candidate_c FROM stemmer UNION SELECT vote_id, 4, vote_SELECT_voices UNION_5, vote_SELECT_voices UNION_5 UNION SELECT stemme_id, 6, stemme_ candidate_f FROM votes ) a WHERE vote_candidate IKKE I (4,3,5) GROUP BY vote_id) bON a.vote_id =b.vote_idAND a.vote_order =b.min_vote_orderGROUP BY vote_candidate; 


  1. ClusterControl - Advanced Backup Management - mariabackup del I

  2. H2 opdatering med join

  3. Opretter ActionScript Date-objekt fra MySQL UTC-tidsstempelstreng

  4. MySQL forespørger efter eksempler med svar