2012-02-07 160 views
1

我試圖根據他們有標籤找到一些記錄。爲了找出一個記錄有哪些標籤,我使用子查詢將它們添加到結果中。爲了找出應該返回哪些結果,我在查詢的末尾添加了一個有聲明。但有些事告訴我這不是最好的方法。是否有替代MYSQL HAVING

SELECT e.id, e.title, e.text, e.introduction, 
    UNIX_TIMESTAMP(e.starts_on) AS starts_on, 
    UNIX_TIMESTAMP(e.ends_on) AS ends_on, 
    m.id AS meta_id, 
    m.url, 
    cm.title AS category_title, 
    cm.url AS category_url, 
    CONCAT(
    ",", 
    (
     SELECT GROUP_CONCAT(t.id) 
     FROM modules_tags AS mt 
     JOIN tags AS t ON t.id = mt.tag_id 
     WHERE mt.other_id = e.id 
    ),"," 
) AS tags_search 
FROM event_posts AS e 
INNER JOIN meta AS m ON e.meta_id = m.id 
LEFT JOIN event_categories AS c ON e.category_id = c.id 
LEFT JOIN meta AS cm ON c.meta_id = cm.id 
LEFT JOIN modules_tags AS mt ON mt.other_id = e.id 
LEFT JOIN tags AS t ON t.id = mt.tag_id 
WHERE 1 HAVING tags_search LIKE '%,5,%' AND tags_search LIKE '%,6,%' 
+0

在這種情況下不需要HAVING。在GROUP BY之後有WHERE過濾器,WHERE過濾器之前。所以WHERE子句在這種情況下會做同樣的事情。 – 2012-02-07 15:30:48

+0

我沒有測試過,所以它可能無法正常工作,但除非您在查詢後需要在代碼中使用tags_search,那麼您可以將您在HAVING中使用的過濾器放在子查詢中 - 但將該子查詢移動到主要查詢的WHERE子句與EXISTS表達式。 – 2012-02-07 15:33:08

回答

1

FIND_IN_SET()是在MySQL中以逗號分隔值查找值的最佳方法。