February 2026

S M T W T F S
1234567
891011121314
15161718192021
22232425262728

Style Credit

Expand Cut Tags

No cut tags
Wednesday, September 22nd, 2010 12:09 am
Знатокам (My)SQL: имеется некий большой JOIN, вытаскивающий данные из нескольких сцеплённых таблиц (типа несколько обьектов, связанных many-to-many). Указанный запрос возвращает список IDs некоторых обьектов, согласно заданым отношениям, но в нём возможны повторения, а надо список без. Для того, чтобы повторения убрать, можно написать SELECT distinct table1.id и т.п. Но по некоторым причинам, в которые мы вдаваться не будем, это решение в данном случае не идеально. Можно написать subquery с IN и перетащить часть обьектов туда, но заботами разработчиков MySQL subqueries в нём работают так, что не к ночи будь помянуты. Так вот - есть ли ещё какой-то способ обеспечить уникальность, о котором я не подумал? (Обрабатывать на клиентской стороне не предлагать, это тоже, увы, не подходит по причинам... ну вы поняли).
Wednesday, September 22nd, 2010 07:28 am (UTC)
GROUP BY? Ну а потом мягко проигнорировать агрегатную функцию. Но это ведь то же самое.
Wednesday, September 22nd, 2010 07:41 am (UTC)
Почему разваливается? HAVING наверное должен помочь.
Wednesday, September 22nd, 2010 07:38 am (UTC)
group by заменяет distinct
Wednesday, September 22nd, 2010 07:44 am (UTC)
Stored procedure с использованием внутри temporary table?
Wednesday, September 22nd, 2010 10:17 am (UTC)
в принципе можно и без sp, только через temporary table,

ну и таки HAVING, это такой финальный WHERE, который можно использовать после GROUP BY
Wednesday, September 22nd, 2010 12:28 pm (UTC)
Group by и having, иногда может помочь выбор из одной и той же таблицы два раза (from table1 a, table1 b ... having a.id = b.id).
Wednesday, September 22nd, 2010 12:50 pm (UTC)
Из мануала

Because DISTINCT may use GROUP BY ...
In most cases, a DISTINCT clause can be considered as a special case of GROUP BY. For example, the following two queries are equivalent ...

можно узнать чем DISTINCT вам не подходит и увидеть сам запрос ?
Wednesday, September 22nd, 2010 08:09 pm (UTC)
Если считаете, что родной DISTINCT медленно работает (а какие еще причины?) можно скинуть все в PL/SQL table (SELECT BULK COLLECT INTO) и вычистить дубликаты программно.
Ну и select a,b,c from sample_table group by a,b,c тоже работает.