【问题标题】:Mysql query based on columns matches基于列匹配的Mysql查询
【发布时间】:2016-06-02 18:29:46
【问题描述】:

我不知道怎么用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

【问题讨论】:

  • 你的桌子设计很糟糕。你需要改变它。您需要这方面的帮助吗?
  • 知道如何改进它吗?
  • 您需要一张包含用户的表格。然后是一张有问题的桌子。最后是一个包含 user_id、question_id 和 answer_value 的答案表。
  • 如果我有这些表,查询会怎样?

标签: php mysql testing match rank


【解决方案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
     );
    

你可以使用查询来检索数据:

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;

【讨论】:

  • 好的,也许最好有一个用户表和一个包含 id 用户的答案表?会更好吗?如何使用该结构获得结果?有 2 张桌子会更快吗?
  • 为您的问题更新了更好的设计。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多