Выборка строк mysql по заданному парамерту

405
17 января 2017, 23:55

Суть следующая: Имеется таблица

id id_abitur quest answer 
1 20170001 exam 9
2 20170001 exam 10
3 20170001 exam 17
8 20170002 exam 9
9 20170002 exam 10
10 20170002 exam 14
11 20170002 exam 17
16 20170003 exam 9
17 20170003 exam 10
18 20170003 exam 14
19 20170003 exam 17
24 20170004 exam 9
25 20170004 exam 10

допустим мне нужна выборка id_abitur, у которых quest='exam' и answer только 9,10,17 делая запрос

SELECT `id_abitur`, COUNT(`id`) AS c 
FROM meta_abitur 
WHERE  `quest`='exam' AND `answer` IN (9,10,17) 
GROUP BY `id_abitur` 
HAVING c = 3

Выводятся id 9,10,17 а так же у которых 9,10,17,19, т.е. те у которых есть еще одна строка. Что я делаю не так и как это исправить?

Answer 1

Заменим COUNT на SUM. Если ответил на нужные вопросы - прибавляем один. Если на другие - отнимаем 1. Берем только те, где сумма равна трём:

SELECT `id_abitur`, 
sum(case when `answer` IN (9,10,17) then 1 else -1 end) AS c FROM meta_abitur 
WHERE  `quest`='exam'  GROUP BY `id_abitur` HAVING c = 3;

http://sqlfiddle.com/#!9/ef21d2/5

Answer 2

Вариант:

SELECT
  DISTINCT `t1`.`id_abitur`
FROM
  tab AS `t1`
LEFT JOIN (
  SELECT
    `t2`.`id_abitur`
  FROM
    tab AS `t2`
  WHERE
    `t2`.`answer` NOT IN (9,10,17) AND
    `t2`.`quest` = 'exam'
) AS `j` ON
  `t1`.`id_abitur` = `j`.`id_abitur`
WHERE
  `j`.`id_abitur` IS NULL AND
  `t1`.`quest` = 'exam'
GROUP BY
  `t1`.`id_abitur`
HAVING
  COUNT(`t1`.`id_abitur`) = 3

На SQL Fiddle.

Answer 3

Группируй по полю answer:

SELECT 
  id_abitur, 
  COUNT(id) AS c 
FROM 
  meta_abitur 
WHERE  
  quest='exam' AND 
  answer IN (9,10,17) 
GROUP BY 
  answer 
HAVING c = 3
Answer 4

Еще один вариант: Внутренний подзапрос определяет количество ответов для каждого абитуриента. Внешний запрос соединяет таблицу meta_abitur с подзапросом с учетом количества (c) и номеров (answer in (9,10,17)) правильных ответов и параметра quest
select distinct id_abitur from meta_abitur i inner join (select id_abitur,count(*) as c from meta_abitur WHERE quest='exam' group by 1 having c=3) o USING(id_abitur) where answer in (9,10,17);

READ ALSO
Отваливается general_log в mariadb

Отваливается general_log в mariadb

Есть необходимость писать все запросы к БД в файлДля этого включаю в настройках (переменные сервера) general_log=1 Однако спустя время (возможно...

294
Проблемы с восстановлением сайта на Joomla

Проблемы с восстановлением сайта на Joomla

Всем приветЕсть бэкап Joomla сайта, сделанный в Akeeba

341
Параметр с переменной арностью

Параметр с переменной арностью

Параметр с переменной арностью с типом элемента, недоступным во время выполнения, может привести к замусориванию кучи и породить предупреждения...

325
Ограничивающая фигура динамического 3D объекта, библиотека Bullet

Ограничивающая фигура динамического 3D объекта, библиотека Bullet

Столкнулся с проблемой создания ограничивающей фигуры для 3D объекта моделька которого состоит из множества Mesh Для создаия ограничивающей...

348