на основе Как реализовать систему тегирования, аналогичную SO, в php / mysql?
Я внес небольшие изменения и получил следующую реализацию тега изображения:
SELECT I.imageId, GROUP_CONCAT(DISTINCT T.tagName SEPARATOR ' '), COUNT(*)<br>
FROM Images I<br>
INNER JOIN ImageTagMap M ON I.imageId = M.imageId<br>
INNER JOIN ImageTags T ON T.tagId = M.tagId<br>
WHERE T.tagName LIKE '%new%' OR T.tagName LIKE '%yo%'<br>
GROUP BY I.imageId<br>
ORDER BY COUNT(*) DESC
в настоящее время это успешно получает imageId всех этих изображений, которые заполняют предложение WHERE, и упорядочивает их в соответствии с большинством совпадений (нет совпадений, генерируемых предложением GROUP BY).он также получает все совпадающие имена тегов и помещает их в одну строку.хорошо.
что я действительно хотел бы для пользователя, так это иметь все tagNames для соответствующей картинки.в настоящее время возвращаются только те теги, которые соответствуют операторам LIKE.Например, если изображение помечено как «2010 Нью-Йорк», и я ищу (как указано выше) «Нью-йо», оно вернет imageId, «Нью-Йорк».но мне нужна вся информация о тегах для сопоставленного изображения, я хочу imageId, "new york 2010".
простое решение - вставить вышеуказанный запрос в подзапрос и повторно выполнить объединение с новым предложением WHERE.imageId IN (запрос выше как подзапрос).хотя это кажется глупым (даже если оптимизатор может творить с ним магию), конечно, мне не нужно повторять одно и то же соединение дважды?или я?
в сторону, есть ли лучший способ поиска по тегам, чем застрявший в куче LIKE?