基于列匹配的Mysql查询

时间:2016-06-02 18:29:46

标签: php mysql testing match rank

我不知道怎么用mysql做这个,我只知道如何做基本查询,我想根据匹配显示结果列表,结果将根据答案的相同值显示...答案可能具有1-10的值

+++++++++++++++TABLE++++++++++++

id  | userName | answer1 | answer2 | answer3 | answer4….

10    Jhon       1        1         3          8

11    Anne       1        2         4          8

12    Mike       7        4         5          7

etc…
++++++++++++++++++++++++++++++++++++++++

如果我在查询中发送值,我想检查答案并显示结果排序我的匹配, 更多匹配首先...没有匹配最后

所以,如果我发送结果:

answer1=1  answer2=1 answer3=7 answer4=2...

结果应该是(给回id)

10 11 12

1 个答案:

答案 0 :(得分:1)

您的桌面设计不合适,您应该将其分为用户和问题表。

如果您无法更改表格设计,可以使用此查询解决问题:

select
  id,
  username,
  if(answer1 = :an1, 1, 0) + if(answer2 = :an2, 1, 0) + if(answer3 = :an3, 1, 0) + if(answer4 = :an4, 1, 0) as total
from
  table
order by total desc

<强>更新    更好地解决这个问题:

使用实时演示检查SQLFiddle:http://sqlfiddle.com/#!9/6c145/2

  1. 创建用户表

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY,
        username VARCHAR(50) NOT NULL
    );
    
  2. 创建问题表

    CREATE TABLE questions (
        id INT PRIMARY KEY,
        correct_answer INT NOT NULL
    );
    
  3. 创建用户答案表

     CREATE TABLE user_answers (
         user_id INT,
         question_id INT,
         user_answer TINYINT,
         PRIMARY KEY (user_id, question_id),
         FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE NO   ACTION ON UPDATE NO ACTION,
         FOREIGN KEY (question_id) REFERENCES questions (id) ON DELETE NO ACTION ON UPDATE NO ACTION
     );
    
  4. 要检索数据,您可以使用查询:

    SELECT
        tmp.id,
        tmp.username,
        sum(tmp.is_correct) as total
    FROM (
        SELECT
            users.id,
            users.username,
            IF (questions.correct_answer = user_answers.user_answer, 1, 0) as is_correct
        FROM
            users
            INNER JOIN user_answers on users.id = user_answers.user_id
            INNER JOIN questions on user_answers.question_id = questions.id
    ) tmp
    GROUP BY tmp.id, tmp.username
    ORDER BY total desc;