Mysql-запрос на основе совпадений столбцов

Я не знаю, как сделать это с 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...

результат должен быть (вернуть идентификатор)

10 11 12

0

Решение

Ваш дизайн таблицы не очень хороший, вы должны разделить его на таблицу пользователей и вопросов.

Если вы не можете изменить дизайн таблицы, вы можете решить проблему с помощью этого запроса:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]