У меня есть строка category IDs
это выглядит так 1;2;3;4;
,
Теперь я хочу получить все сообщения, которые содержат каждую из этих переменных в category
столбец posts
Таблица.
category
столбец также имеет такое содержание 1;2;3;
в зависимости от того, какие категории были прикреплены к сообщению.
Как я могу настроить PDO query
который проверяет, находится ли какое-либо значение из первичной строки в пределах category
столбец в почтовой таблице?
Я ищу что-то похожее category LIKE = IN (2;3;4;)
Также он должен работать с двойными / тройными … цифрами, например так: 2;44;23;
,
Пример:
Я использую строку 1;
получить из таблицы сообщений, и результат, который я хочу вернуть, Post 1
а также Post 3
потому что они оба содержат 1;
,
Наилучшим вариантом является рефакторинг таблицы в posts
таблица (без поля списка категорий) и posts_categories
таблица (с полями post_id и category_id).
Затем используйте простой запрос, подобный этому:
SELECT DISTINCT p.*
FROM posts_categories AS pc
INNER JOIN posts AS p ON pc.post_id = p.post_id
WHERE pc.category_id IN ([your list of values])
;
К сожалению, большинство библиотек баз данных не поддерживают произвольные списки параметров, поэтому вам может потребоваться сгенерировать точную серию ?,?,?,...
в коде; но я не знаком с pdo и только немного знаком с php.
Изменить: измененный запрос, чтобы показать только данные из сообщений, и только один раз за сообщение.
Если вы хотите список категорий, а также ….
SELECT DISTINCT p.*
, GROUP_CONCAT(assoc_pc.category_id SEPARATOR ';') AS catList
FROM posts_categories AS filtering_pc
INNER JOIN posts AS p ON filtering_pc.post_id = p.post_id
INNER JOIN posts_categories AS assoc_pc ON p.post_id = assoc_pc.post_id
WHERE filtering_pc.category_id IN ([your list of values])
GROUP BY p.post_id
;
GROUP_CONCAT
специфичен для MySQL; если вы хотите немного больше независимости от платформы, вы можете SELECT p.*, assoc_pc.caetgory_id
и просто ORDER BY p.post_id
и построить catList в коде при обработке несгруппированных результатов.
Изменить: исправлена опечатка, неправильный псевдоним, во втором примере запроса.
Других решений пока нет …