MySQL - поиск с помощью UNION ALL и GROUP BY - PullRequest
6 голосов
/ 11 октября 2010
SELECT p.id, p.title, p.uri, 'post' AS search_type
FROM `posts` AS p 
WHERE title LIKE "%logo%" 

UNION ALL 

SELECT p.id, p.title, p.uri, 'tag' AS search_type
FROM posts AS p 
INNER JOIN post_tags AS pt ON pt.post_id = p.id 
INNER JOIN tags AS t ON pt.tag_id = t.id 
WHERE t.title LIKE "%logo%"

UNION ALL

SELECT p.id, p.title, p.uri, 'category' AS search_type
FROM posts AS p 
INNER JOIN post_categories AS pc ON pc.post_id = p.id 
INNER JOIN categories AS c ON pc.category_id = c.id 
WHERE c.title LIKE "%logo%"

GROUP BY p.id
LIMIT 30

Я пытаюсь сгруппировать идентификаторы постов, чтобы не возвращать дубликаты результатов поиска, но по какой-то причине есть дубликаты, даже когда я использую GROUP BY p.id. Может кто-нибудь сказать мне, что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 09 октября 2012

Вот пример, который не работает с MySQL:

SELECT Column1, SUM(Column2) AS Column2Total
FROM
(
    SELECT Column1, Column2 FROM Table1
    UNION ALL
    SELECT Column1, Column2 FROM Table2
) AS UnionTable
GROUP BY Column1
6 голосов
/ 11 октября 2010

GROUP BY сгруппирует результаты только вашей третьей части запроса. Сначала будет GROUP, а затем UNION.

Заключить весь запрос в подзапрос и GROUP в нем.

...