Использовать разделенное запятыми значение столбца MySQL в LIKE

#php #mysql #sql

#php #mysql #sql

Вопрос:

У меня есть столбец в моей базе данных с именем as foodtype . Имя таблицы — ресторан, а значения столбца foodtype разделены запятыми (например, индийский, китайский).

Теперь, когда пользователь выбирает китайский, запрос i want mysql должен возвращать ресторан, где foodtype есть китайский.

Запрос должен стать таким, как показано ниже:

 SELECT * FROM restaurant WHERE cityname='Chicago' and foodtype 
LIKE ('%Chinese%')
  

И когда пользователь выбирает Indian, тогда запрос i want mysql должен возвращать ресторан, где foodtype является индийским.

Запрос должен стать таким, как показано ниже:

 SELECT * FROM restaurant WHERE cityname='Chicago' and foodtype 
LIKE ('%Indian%')
  

И когда пользователь выбирает Indian и Chinese, тогда запрос i want mysql должен возвращать ресторан, в котором foodtype является индийским и китайским.

Запрос должен стать таким, как показано ниже:

 SELECT * FROM restaurant WHERE cityname='Chicago' and foodtype 
LIKE ('%Indian%,%Chinese%')
  

Пожалуйста, дайте мне знать, как я могу этого добиться.

Комментарии:

1. На самом деле вам следует исправить дизайн вашей базы данных. Используйте другую таблицу для хранения типов продуктов, которые запрашивают объект с помощью соединения.

Ответ №1:

Используйте FIND_IN_SET()

 SELECT * 
FROM restaurant 
WHERE cityname='Chicago' 
and find_in_set(foodtype, 'Indian') > 0
and find_in_set(foodtype, 'Chinese') > 0
  

Но на самом деле вам лучше изменить структуру таблицы. Никогда, никогда, никогда не храните несколько значений в одном столбце!

Для достижения этого вы можете добавить 2 другие таблицы в свою БД

 foodtypes table
---------------
id
name


restaurant_foodtypes
--------------------
restaurant_id
foodtype_id
  

Пример данных:

 foodtypes
id   |  name
1    |  chinese
2    |  indian

restaurant_foodtypes
restanrant_id  |  foodtype_id
1              |  1
1              |  2
  

Затем вы можете выбрать рестораны, имеющие оба типа питания, подобные этому

 select r.name
from restaurants r
join restaurant_foodtypes rf on rf.restaurant_id = r.id
join foodtypes f on rf.foodtype_id = f.id
where f.name in ('indian','chinese')
group by r.name
having count(distinct f.name) = 2
  

Комментарии:

1. FIND_IN_SET() не замедлит поисковый запрос?

2. Можете ли вы, пожалуйста, сообщить мне, как я могу хранить несколько значений foodtype для одного ресторана?

3. Не более, чем использование `LIKE’%’, которое не может использовать индексы. Вот почему вам следует изменить структуру таблицы