#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’%’, которое не может использовать индексы. Вот почему вам следует изменить структуру таблицы