2010-10-10 53 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 

Tôi đang cố gắng nhóm các ID bài đăng để không trả lại kết quả tìm kiếm trùng lặp, nhưng vì lý do nào đó có trùng lặp ngay cả khi tôi sử dụng GROUP BY p.id. Ai đó có thể cho tôi biết tôi đang làm gì sai?MySQL - Tìm kiếm với UNION ALL and GROUP BY

+0

Bạn chỉ muốn một kết quả mỗi p.id, bất kể SEARCH_TYPE? –

+1

Hey Mark, không, tôi muốn tất cả các kết quả. Search_type chỉ cho phép tôi xác định kết quả tìm kiếm đến từ đâu (bài đăng, thẻ hoặc danh mục). – Torez

Trả lời

6

GROUP BY sẽ chỉ nhóm các kết quả của phần thứ ba của truy vấn của bạn. Nó sẽ đầu tiên GROUP, sau đó UNION.

Đưa toàn bộ truy vấn vào truy vấn phụ và GROUP trên đó.

6

Dưới đây là một ví dụ mà không làm việc với 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