Исключить из запроса SQL по двум условиям

D
На сайте с 28.06.2008
Offline
1108
455

Составил запрос, почти то что мне нужно отфильтровал, застрял на последнем - как убрать из запроса города для которых есть данные и за 2021 и 2020 год? 

Оставить нужно только за те города у которых последний год с данными - 2020

SELECT t1.rayon, t3.year, COUNT(t1.id) as vsego 
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020 
GROUP BY t1.rayon,t3.year

Стрелками пометил те строки которые должны пропасть из запроса



Lazy Badger
На сайте с 14.06.2017
Offline
228
#1

Если использовать голову по назначению, то строка

INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020 

будет первым кандидатом на "попробовать подумать". И явно видно по вопросу, что запрос написан не вами, милсдать. Да и спрошен отвратно (про структуру данных вообще молчу по причине отсутствия нормативной лексики)

Производство жести методом непрерывного отжига
D
На сайте с 28.06.2008
Offline
1108
#2

Запрос написан лично мной (я всегда джойные таблицы называю через t, можете через поиск убедиться). Ответ уже и не особо нужен, последнее условие проще для меня было "доработать" PHP скриптом, что я и сделал. 

Но просто интересно было бы посмотреть на запрос, который бы мог это сделать чисто в SQL, так сказать обучения для. 

_
На сайте с 01.09.2022
Offline
3
#3
Dram #:

Запрос написан лично мной (я всегда джойные таблицы называю через t, можете через поиск убедиться). Ответ уже и не особо нужен, последнее условие проще для меня было "доработать" PHP скриптом, что я и сделал. 

Но просто интересно было бы посмотреть на запрос, который бы мог это сделать чисто в SQL, так сказать обучения для. 

GROUP BY t1.rayon,t3.year

убрать t3.year из группировки?

Елена П.
На сайте с 02.10.2020
Offline
52
#4
Dram #:

Запрос написан лично мной (я всегда джойные таблицы называю через t, можете через поиск убедиться). Ответ уже и не особо нужен, последнее условие проще для меня было "доработать" PHP скриптом, что я и сделал. 

Но просто интересно было бы посмотреть на запрос, который бы мог это сделать чисто в SQL, так сказать обучения для. 

выбрать COUNT(t1.id) as vsego   для каждого года отдельной колонкой , а дальше where 

.SELECT t1.rayon,  .. ,(select .... ) as 2020y,   (select ..... ) as 2021y ,   

это как один из возможных вариантов. 

D
На сайте с 28.06.2008
Offline
1108
#5

Придумал и свой вариант, правда в 2 запроса через создание другой таблицы

CREATE TABLE `t_temp` 
as  (
SELECT t1.rayon, t3.year, COUNT(t1.id) as vsego
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020
GROUP BY t1.rayon,t3.year
);

SELECT rayon,year,vsego, COUNT(rayon) as city FROM `t_temp`
GROUP BY rayon
HAVING city < 2
Lazy Badger
На сайте с 14.06.2017
Offline
228
#6
Dram #:

Придумал и свой вариант, правда в 2 запроса через создание другой таблицы

RTFM `SELECT ... FROM SELECT`

D
На сайте с 28.06.2008
Offline
1108
#7

Спасибо за язвительные замечания, узнал про Селект фром селект

SELECT rayon,year,vsego, COUNT(rayon) as city FROM 
(
SELECT t1.rayon, t3.year, COUNT(t1.id) as vsego
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020
GROUP BY t1.rayon,t3.year
) as t
GROUP BY rayon
HAVING city < 2
L
На сайте с 10.02.2015
Offline
247
#8

Можно проще:

SELECT t1.rayon, t3.year, COUNT(t1.id) as vsego 
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id
WHERE t3.year >=2020 
GROUP BY t1.rayon,t3.year
HAVING MAX(t3.year) = 2020

Обн.: Не, не канает

Вот такой выберет, только его можно использовать только для одного года:

SELECT t1.rayon, COUNT(t1.id) as vsego 
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id
WHERE t3.year >=2020 
GROUP BY t1.rayon
HAVING MAX(t3.year) = 2020

А лучше так (а, не, тут vsego корректно посчитается тоже за 1 год):

SELECT rayon,year,vsego
FROM 
(
SELECT t1.rayon, t3.year, COUNT(t1.id) as vsego 
FROM `univer_big` as t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020 
GROUP BY t1.rayon,t3.year
) as t
GROUP BY rayon
HAVING MAX(year) = 2020

На любые года:

SELECT
	t1.rayon, t3.year, count(*) vsego
FROM
	`univer_big` t1
INNER JOIN univer_items as t2 on t2.rayon=t1.rayon
INNER JOIN univer_exam as t3 on t3.item_id=t2.id
INNER JOIN (
SELECT
t1.rayon
FROM
`univer_big` as t1 INNER JOIN univer_items as t2 on t2.rayon=t1.rayon INNER JOIN univer_exam as t3 on t3.item_id=t2.id WHERE t3.year >=2020 GROUP BY t1.rayon HAVING MAX(t3.year) = 2020 ) I ON I.rayon = t1.rayon
WHERE t3.year >= 2020 GROUP BY t1.rayon, t3.year
D
На сайте с 28.06.2008
Offline
1108
#9
Ваш последний запрос чуть быстрее 0.12 сек против 0.15 у моего (селект фром селект) и экслпейн у него получше, спасибо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий