#php #mysql
#php #mysql
Вопрос:
Я пытаюсь внедрить систему тегов в статьях на моем веб-сайте. Каждая строка статьи в моей базе данных имеет tags
столбец, который может содержать строку типа php html css jquery
.
При запросе к базе данных я хочу возвращать только 10 результатов одновременно. Вот что я использую в данный момент:
$sql = "SELECT * FROM articles WHERE tags LIKE '%" . $tag . "%' LIMIT " . $start . ", 10";
Мне пришло в голову, что это будет неточно. При ограничении результатов он возьмет 10 записей после строки $start
, а затем найдет те, которые содержат $tag
.
Что мне нужно, чтобы он сделал, это сначала нашел все строки, которые содержат $tag
теги in, а затем ограничил результаты.
Кажется довольно простым сделать это с помощью двух запросов, но является ли это наиболее эффективным способом сделать это?
Каков наилучший способ получить 10 строк, содержащих значение, $tag
начинающееся со смещения $start
?
Комментарии:
1. Хм … вот как это работает.
LIMIT
применяется к результирующему набору после примененияWHERE
.2. @NiettheDarkAbsol Мой плохой, я думал, что это сначала ОГРАНИЧИВАЕТ набор. Я бы удалил вопрос, но на него есть ответ… Итак, мой запрос хорош?
3. Да, это хорошо. Полученный вами ответ — codswallop.
Ответ №1:
Одним из вариантов было бы использовать подзапрос, чтобы вы выбирали limit из уже отфильтрованных результатов:
$sql = "SELECT * FROM ( SELECT * FROM articles WHERE tags LIKE '%" . $tag . "%' ) LIMIT " . $start . ", 10";
Ответ №2:
Раньше я работал в крупном интернет-портале новостей, и мы делали подобные вещи, используя таблицы tag и tags (с идентификатором AI), которые содержали item_id и type_id (1 для статей, 2 для изображений и т.д.). Затем мы получим идентификаторы из этой таблицы (что выполняется ОЧЕНЬ быстро) и решим возникшую у вас проблему.
Like this (tags): (id is only for updates and deletes, and order of addition if needed and not modified by an update)
id | tag | item_id | item_type
1 | 1 | 1 | a
2 | 1 | 2 | a
3 | 1 | 2 | i
Then the tag table:
id | value
1 | php
2 | js
3 | mysql
И так далее. Тогда у нас будет чистый список ВСЕХ тегов для просмотра, а также действительно простой способ получить количество элементов под каждым тегом. Возможно, стоит подумать, если вы хотите иметь возможность отображать все ваши теги на боковой панели, а также количество элементов в каждом из них.