Каждая статья может иметь неограниченные категории.
Категории сохраняются в базе данных следующим образом:
пример article_category: '1', '3', '8'
ИЛИ
example article_category: '2', '3'
Поэтому, когда я ищу список ниже, скажем, категория 3
$category_id = $_REQUEST['category_id']; //3 $SQL = "SELECT * FROM ARTICLES WHERE article_category = '$category_id'";
Если бы это было только одно, то это было бы хорошо.
Я ненавижу это говорить, но я полностью потерял .. Я бы использовал IN?
= (равно) проверить на полную строку. то, что вы хотите сделать, может быть сделано с использованием LIKE и% comodin (это как * для файлов в каталоге или подобных)
$SQL = "SELECT * FROM ARTICLES WHERE article_category LIKE \"%'$category_id'%\"";
однако я рекомендую вам нормализовать базу данных и иметь категории в качестве подтаблицы
То, как я буду реализовывать это, – это создать таблицу для категорий, которую вы, вероятно, уже имеете. Что-то вроде:
cat_id cat_name 1 animals 2 sports 3 locations
Затем создайте таблицу для привязки статей к категориям. Что-то вроде:
table artcat article_id cat_id 1 1 1 3 2 1 2 2 2 3
Вышеприведенная таблица в основном заменяет поле article_category, которое у вас есть. В приведенном выше примере
article 1 is linked to categories 1 and 3 article 2 is linked to categories 1, 2 and 3
И когда вам нужно получить все статьи для данной категории, все, что вы будете запускать запрос, например:
SELECT article_id FROM artcat WHERE cat_id=3
Вы можете даже присоединиться к базе данных статей, чтобы вывести заголовки статей, если хотите.
Надеюсь, это поможет. Удачи!
Здесь вы можете использовать FIND_IN_SET
, но это может быть не очень эффективно. Я предлагаю вам изменить структуру таблицы и выполнить ответ @jdias.
Если ваша article_category
сохранена как 1,2,3
:
$SQL = "SELECT * FROM ARTICLES WHERE FIND_IN_SET('$category_id', article_category)";
Или, если он сохранен как '1','2','3'
:
$SQL = "SELECT * FROM ARTICLES WHERE FIND_IN_SET('\'$category_id\'', article_category)";