У меня есть таблица mysql, содержащая данные и категории новостей, и я пытаюсь выбрать все данные в определенной категории. Я не думал достаточно далеко вперед, поэтому в какой-то момент я не использую нормализованную таблицу, я могу вернуться и перезаписать эту часть, чтобы использовать нормализованную таблицу.
Вот моя структура таблицы
+---------+------------+------------+--------+----------+ | news_id | news_title | news | cat_id | date | +---------+------------+------------+--------+----------+ | 1 | title1 | blahblah |1,2,4,6 |2009-11-24| +---------+------------+------------+--------+----------+ | 2 | new title | text 123 | 2 |2009-01-24| +---------+------------+------------+--------+----------+ | 3 | new title3 | text 3 | 2,19,6 |2009-02-24| +---------+------------+------------+--------+----------+
Предположим, я хочу вернуть все результаты для категории 2. Я пытаюсь использовать этот оператор.
$query= mysql_query("SELECT id FROM `news_data` WHERE FIND_IN_SET('" . str_replace(',',"',cat_id) OR FIND_IN_SET('",$cat_id)."',cat_id)") or die(mysql_error());
Это возвращает результаты для идентификаторов новостей 2 и 3, потому что они начинаются с «2». Первый идентификатор новостей не выбран, потому что второе значение – «2». Я знаю, что это просто неправильно с оператором mysql, и я надеюсь, что кто-то сможет мне помочь.
Спасибо, Брук
еще один классный способ:
select id from news_data where cat_id regexp '(^|[^0-9])2([^0-9]|$)';
… работает с любым разделителем / интервалом.
в дополнение к другим отличным ответам
Просто удалите цитаты из числа внутри find_in_set. Работал для меня.
" WHERE FIND_IN_SET(" . str_replace(',',",cat_id) OR FIND_IN_SET(",$cat_id).",cat_id)")
Это плохой дизайн. Это нарушает одно из правил нормировки для схемы (сначала «второй», я не могу вспомнить).
Это отношения «многие-ко-многим», потому что похоже, что элемент новостей может иметь много категорий, а категория может принадлежать многим новостям. Моделируйте это так, и у вас будет лучший дизайн.
Использование:
WHERE INSTR(CONCAT(t.cat_id, ','), '2,') > 0
Справка: