Как организовать вывод из БД данных указанных через запятую?

Доброго времени суток.
В базу вношу категории указывая их ID через запятую (например, столбец category = 1,3,4), есть отдельная таблица category, где эти цифры являются ID поля. Так как файл (категории для файла делаются), может состоять в нескольких категориях (от 1 и до бесконечности), то создавать столбцы для отдельной категории не вижу смысла. На странице файла проблем с выводом не возникло (explode и все готово). Но дальше я столкнулся с такой проблемой. На странице самой категории, где выводятся файлы, не могу организовать поиск и вывод файлов, если файл имеет несколько категорий.
$cid = $_GET['id']; // допустим, что это ID той категории, что я сейчас просматриваю.
$stmt = $go -> prepare("SELECT `id` FROM `images` WHERE `category` = ? ORDER BY `id` DESC LIMIT ?, ?");
$stmt -> execute([$cid, $nav -> start(), $max]);
$images = $stmt -> fetchAll();

Данный код прекрасно работает, если категория 1, но не если их больше.
Как мне сделать запрос так, чтобы он выводил файл из категории, например [2], если столбец `category` = '1,2,3,4,5`?

Рассматривал вариант с %LIKE%, но решил спросить, вдруг есть более нормальный способ.
  • Вопрос задан
  • 556 просмотров
Решения вопроса 1
@f_u_s_s
Любопытный кодер
Я бы сделал отдельную таблицу, например images_to_category и в ней 2 колонки: image_id, category_id и прописывал каждую связь картинки с категорией отдельно в строку, т.е. если допустим изображение file.jpg имеет id 3 и находится в 3х категориях с id 7, 20 и 45 то в этой таблице были бы записи:

image_id | category_id
3 | 7
3 | 20
3 | 45

а при выборке по нужной категории использовал бы JOIN. Например если я просматриваю категорию с id 7, то запрос должен уйти в базу примерно такой:

SELECT i.id FROM images i
JOIN images_to_category i2c ON i.id=i2c.image_id
WHERE i2c = 7;


И результатом были бы все id изображений, находящихся в категории с id 7. Как-то так.

А вариант с LIKE слишком много подводных камней имеет, например: у вас куча категорий и вы открыли категорию с id 2. Запрос будет LIKE %2% и тогда вы получите изображения и из категорий с id 20, 12, 42, 102 и т.д.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега PHP
Web developer
столкнулся с такой проблемой

Этого и следовало ожидать, потому что
В базу вношу категории указывая их ID через запятую


создавать столбцы для отдельной категории не вижу смысла

Вы вообще знакомы с основами реляционных БД? Почитайте хотя бы про нормализацию.
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Поэтому я и задал такой вопрос, так как банально не знаю, как еще могу реализовать, чтобы файл был в нескольких категориях одновременно и спокойно искался по базе.
У вас проблема с СУБД. Она не поддерживает операции со списками: STRING_SPLIT (Transact-SQL).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы