Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Phân phối lại phiếu bầu trong khi loại bỏ các ứng cử viên

Đang chơi.

Tôi nghĩ rằng việc sử dụng bố cục dữ liệu hiện tại của bạn nếu có thể được thực hiện như:-

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;

Điều này là khá nhiều như những người ưa thích đã trả lời. Tôi không quan tâm đến điều này vì nó có vẻ không dễ đọc và (nếu lượng dữ liệu lớn) có thể không hiệu quả.

Tôi sẽ có xu hướng tách dữ liệu thành một cấu trúc bảng khác, với nhiều hàng trên mỗi nhóm phiếu bầu, mỗi hàng một ứng cử viên. Điều này sẽ dễ thực hiện hơn nhiều nếu hệ thống đang trong giai đoạn phát triển ban đầu (tức là bạn chỉ cần tạo các bảng mới).

Giả sử dữ liệu hiện có của bạn được thiết lập như sau:-

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);

định dạng của tôi có thể được tạo như sau:-

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;

Sau đó, bạn có thể chỉ cần sử dụng những điều sau đây để nhận được phiếu bầu. Điều này sử dụng một truy vấn phụ để nhận được phiếu bầu cao nhất chưa được sử dụng và sau đó kết hợp ngược lại với dữ liệu.

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 fiddle tại đây:-

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

Một giải pháp kết hợp (tệ nhất trong cả hai thế giới!):-

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel Eloquent so với trình tạo truy vấn - Tại sao sử dụng eloquent để giảm hiệu suất

  2. Mảng tìm nạp MySQL thêm các giá trị trùng lặp?

  3. MySQL TEXT so với BLOB và CLOB

  4. Bộ khởi tạo kiểu cho 'System.Data.Entity.Migrations.DbMigrationsConfiguration`1' đã đưa ra một ngoại lệ

  5. Hợp nhất 2 mảng và tính tổng các giá trị (Phím số)