У меня довольно сложный MySQL Query с несколькими UNION
операторами. Я пытаюсь исключить дубликаты из окончательного вывода, но не все столбцы идентичны (включая идентификатор). Поэтому я хочу использовать GROUP BY
в столбце «имя», чтобы исключить записи с тем же именем. Это для карты коллажей из ряда других слоев карты. Некоторые из маркеров мест появляются на нескольких слоях (то есть ресторан может появляться на слое «обеденный», а также на слое «бары» и слое «Домашняя кухня», каждый с различным идентификатором).
Каждый оператор UNION SELECT
создает только одну строку с именем места, но к концу, после выполнения всех UNION
, у меня будет несколько записей для одного и того же места. Поэтому я чувствую, что мне нужно каким-то образом обрабатывать GROUP BY
на всех данных после каждого UNION
.
Я попытаюсь проиллюстрировать упрощенной версией утверждения ...
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='66'
## RESULT INCLUDES Joes Place AND Eatery
)
UNION
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='82'
## RESULT INCLUDES Joes Place AND Eatery
)
UNION
(
SELECT l.id AS lid, m.markername AS markername, m.id AS mid, m.layer AS mlayer
FROM layertable
INNER JOIN markertable
ON m.layer LIKE Concat('%"',l.id,'"%')
WHERE l.id='91'
## RESULT INCLUDES Joes Place
)
ORDER BY markername ASC
LIMIT 10
Результаты выглядят примерно так ...
| lid | markername | mid | mlayer |
=================================================
| 66 | Joes Place | 10 | ["66","82","91"] |
| 82 | Joes Place | 10 | ["66","82","91"] |
| 91 | Joes Place | 10 | ["66","82","91"] |
| 66 | Eatery | 11 | ["66","82"] |
| 82 | Eatery | 11 | ["66","82"] |
То, что я хочу, это ...
| lid | markername | mid | mlayer |
=================================================
| 91 | Joes Place | 10 | ["66","82","91"] |
| 82 | Eatery | 11 | ["66","82"] |
DISTINCT
, похоже, не работает, потому что записи не полностью идентичны.
Я пытался поставить GROUP BY markername
до и после ORDER BY
, но я получаю сообщение об ошибке синтаксиса в любом случае. Применение его внутри отдельного SELECT
S не помогает, потому что в любом случае у каждой таблицы будет только один экземпляр этого места.
Итак, чтобы повторить мой вопрос:
Как применить GROUP BY
к общему списку после UNION
и вывести только уникально названные места?
ИЛИ есть ли другой способ выполнить эту задачу?
Заранее спасибо.