ВЫБЕРИТЕ строки, ПОДОБНЫЕ тегу, и ОГРАНИЧЬТЕ смещением

#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
  

И так далее. Тогда у нас будет чистый список ВСЕХ тегов для просмотра, а также действительно простой способ получить количество элементов под каждым тегом. Возможно, стоит подумать, если вы хотите иметь возможность отображать все ваши теги на боковой панели, а также количество элементов в каждом из них.