#mysql #sql
#mysql #sql
Вопрос:
То, что я пытаюсь сделать, это выбрать определенное количество билетов (максимум 2), и каждый человек, у которого сумма количества билетов меньше 3, и действительное поле должно быть != ‘e’
У меня есть этот стол:
ID | id_person | nr_tickets | действительный |
---|---|---|---|
1 | 220 | 1 | s |
2 | 220 | 1 | s |
3 | 330 | 2 | s |
4 | 330 | 1 | e |
5 | 331 | 1 | s |
6 | 220 | 2 | s |
7 | 441 | 1 | s |
8 | 442 | 2 | s |
9 | 443 | 1 | s |
10 | 444 | 1 | s |
11 | 445 | 2 | s |
Вот что я сделал:
SELECT m.id, m.id_person, m.nr_tickets, m.valid FROM table m JOIN table m1 ON m1.id lt;= m.id WHERE m.nr_tickets gt; 0 GROUP BY m.id HAVING SUM(case when m.valid != 'e' then m1.nr_tickets end) lt;= 10
Этот запрос дает мне
ID | id_person | nr_tickets | действительный |
---|---|---|---|
1 | 220 | 1 | s |
2 | 220 | 1 | s |
3 | 330 | 2 | s |
5 | 331 | 1 | s |
6 | 220 | 2 | s |
7 | 441 | 1 | s |
8 | 442 | 2 | s |
Как вы можете видеть, запрос почти правильный, дело в том, что у человека 220 в результатах сумма билетов больше 2.
Чего я пытаюсь добиться, так это обойти идентификатор 6 и вместо него использовать идентификатор 9
Комментарии:
1. Я думаю, что если вы используете
GROUP BY m.id
каждый пункт вselect
предложении, исключениеm.id
должно быть согласовано. Это не решит вашу проблему, но это шаг к правильному утверждению.
Ответ №1:
select `id`,`id_person`, sum(`nr_tickets`) as `nr_tickets`, `valid` from `test` group by `id_person` having sum(`nr_tickets`) lt; 3 and `valid`!="e"
Выход:
id id_person nr_tickets valid 5 331 1 s 7 441 1 s 8 442 2 s 9 443 1 s 10 444 1 s 11 445 2 s
Комментарии:
1. вы почти на месте, что мне нужно сделать, это ограничить общую сумму билетов, чтобы она была меньше или равна указанной сумме
2. Подсказка: столбец идентификатора бесполезен, потому что это одно случайное значение из всех в этом утверждении. Если для valid существуют другие значения, кроме «e» и «s», то для valid возникает та же проблема.