Задать вопрос
@aljo222
В процессе обучения веб-разработке

Как получить непересекающиеся строки между двумя запросами с group by?

Здравствуйте!
Есть таблица ресурсов сайта site_resources. В ней может быть по несколько записей по каждому ресурсу - записываются изменения контента. id - id ресурса, уникальное значение для каждого, alias - урл ресурса, тоже уникальное (должно быть).
Так вот, когда я делаю два запроса с group by, то получаю разное кол-во результатов, 292 и 294 соответственно.
SELECT *
FROM `site_resources`
GROUP BY alias;

SELECT *
FROM `site_resources`
GROUP BY id;


Можно ли каким-то образом определить, какие строки попадают в первый, но не попадают во второй запрос?
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
mayton2019
@mayton2019
Bigdata Engineer
Используй except:
select * from ....
except
select * from ....
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
В принципе оба ваших запроса не валидны. Но в принципе для разности запросов есть оператор EXCEPT
SELECT * ....
EXCEPT
SELECT * ....;

https://sqlize.online/sql/mysql80/ef971c6db604639b...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Brezencat
Teamlead Data platform
По сути тебе нужно найти дубли по alias, почему по этой колонке, ты сам отвечаешь в вопросе: «должно быть» и результаты сгруппированных запросов.
Чтобы в этом убедиться довольно просто в запрос добавить фильтрацию по count(*), например:
SELECT alias
, count(*) AS cn
FROM `site_resources`
GROUP BY alias
HAVING count(*) > 2;

В целом это ответит на вопрос, по каким alias есть записи, которые по уникальным ID не группируются.

Если же хочется прям посмотреть на эти записи, то:
SELECT *
FROM (
SELECT id
, alias
, ROW_NUMBER() OVER (PARTITION BY alias ORDER BY id) AS rn
FROM `site_resources`
) AS t
WHERE t.rn > 1;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы