2010-10-10 17 views
6
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 

Estoy intentando agrupar el mensaje de identificación por lo que no devuelven los resultados de búsqueda duplicados, pero por alguna razón hay duplicados, incluso cuando se utiliza la GROUP BY p.id. ¿Puede alguien decirme qué estoy haciendo mal?MySQL - Búsqueda con UNION ALL y GROUP BY

+0

No sólo desea un resultado por p.id, independientemente de search_type? –

+1

Hey Mark, no, quería todos los resultados. El tipo de búsqueda solo me permite definir de dónde vino ese resultado de búsqueda (publicación, etiqueta o categoría). – Torez

Respuesta

6

El GROUP BY agrupará los resultados de su tercera parte de la consulta solamente. Primero será GRUPO, luego UNIÓN.

Incluya toda la consulta en una subconsulta y GROUP en ella.

6

Este es un ejemplo que no funciona con 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