Это довольно странно. У меня есть следующий запрос:
SELECT * , GROUP_CONCAT( x.tag
SEPARATOR ',' ) AS tags
FROM tag AS t, tag AS x, tag_message_rel AS r, message m
INNER JOIN `user` AS u ON m.user_id = u.id
WHERE t.tag
IN (
'kikikiki', 'dsa'
)
AND m.id = r.message_id
AND t.id = r.tag_id
AND x.id = r.tag_id
GROUP BY m.id
HAVING COUNT( * ) >=2
ORDER BY m.created_at DESC
LIMIT 0 , 20
Как видите, я использую t, чтобы присоединиться, чтобы найти нужные мне сообщения, с другой стороны, я использую x, чтобы напечатать теги сообщения. Я стираю строку:
AND x.id = r.tag_id
Я получу сообщения, которые хочу, но теги будут иметь ВСЕ теги в таблице тегов, разделенные комой. Если я оставлю линию там, я получу только эти 2 тега.
Если я использую объяснение, я получаю:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE u system PRIMARY NULL NULL NULL 1 Using temporary; Using filesort
1 SIMPLE t range PRIMARY,tag tag 252 NULL 2 Using where
1 SIMPLE x eq_ref PRIMARY PRIMARY 4 verse.t.id 1
1 SIMPLE r ALL NULL NULL NULL NULL 180 Using where; Using join buffer
1 SIMPLE m eq_ref PRIMARY PRIMARY 4 verse.r.message_id 1 Using where
Сейчас я не эксперт в этом, но я думаю, что проблема в том, что он отказывается повторно присоединять таблицу в процессе оптимизации запроса.
Что ты думаешь? Любое быстрое решение?