возвращать все результаты из строки mysql, разделенной запятыми, соответствующими значению

У меня есть таблица 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 

Справка:

  • INSTR
  • CONCAT