2016-11-08 2 views
-1

У меня есть таблица с именем 'предлагает', которая имеет столбец in_stores. Она содержит идентификаторы магазинов, что это предложение доступно в Графически эта таблица выглядит следующим образом:.Поиск строки в массиве через SQL

id | title | in_stores 
1 | Shoes | 1002,1003 
2 | Gloves | 1020,1011 
3 | Shades | 1002,1009 
4 | Hats  | 1010,1002 
5 | Shoes | 1220 
6 | Shirts | 1010 
7 | Hats  | 1002 

Каждое значение в in_stores сохраняется с implode() функции через PHP.

Мой вопрос: Как выбрать в одном запросе mysqli все предложения, которые доступны в магазине с идентификатором 1002. В этом примере запрос должен возвращать предложения с идентификатором 1,3,4,7 , Я предполагаю, что сначала я должен использовать нечто вроде explode(), чтобы получить результаты в массиве, а не in_array(), чтобы искать в нем определенный идентификатор, но все эти функции недоступны в SQL.

+7

http://stackoverflow.com/questions/3653462/is-storing-a-delimited-list-in-a-database-column-really-that-bad/3653574 – e4c5

+0

Значения, разделенные запятой, которые необходимо найти, - это очень плохая идея. Слишком поздно менять дизайн, чтобы избежать этой проблемы? – PaulF

ответ

1

Это основная проблема при хранении полей, разделенных запятой.

У MySQL есть функция, позволяющая их искать, и это будет намного более надежным, чем попытка полагаться на использование LIKE. Но поскольку он по-прежнему не может эффективно использовать какой-либо индекс, он не будет быстрым.

SELECT * 
FROM offers 
WHERE FIND_IN_SET('1002', in_stores) 

Гораздо лучше перестроить свою базу данных, чтобы использовать дополнительную таблицу со строкой для каждого значения для каждого идентификатора.

+0

Я понимаю лучший способ делать вещи. Просто из любопытства эта функция всегда работает так, как я хочу, в отличие от использования LIKE' с цифрами более 9999? Несмотря на медленность? Он ловит поле в виде массива и ищет его? –

+1

Не знаете, как это работает под обложками, но оно предназначено для надежного нахождения значений в списках, разделенных запятыми. Общая проблема возникает, когда список не разделяется запятой или использует запятую И пробел. http://dev.mysql.com/doc/refman/5.7/ru/string-functions.html#function_find-in-set – Kickstart

+0

Да. Но в моем случае я строго использую значения, разделенные запятыми, без возможности добавления пространства. Я предлагаю вам ответить как правильный, поскольку это точный ответ на то, что я спросил. –

-1

Я думаю, вы должны использовать MySQL LIKE. Он ищет столбец базы данных для строк, указанных в вашем запросе.

Попробуйте этот запрос:

$sql = "SELECT * FROM offers WHERE in_store LIKE '%1002%'"; 

Проверить эту ссылку для более подробного объяснения: W3Schools - SQL LIKE Operator

Я думаю, что следует сделать трюк.

0

Вы «можете» сделать это с помощью LIKE Запрос, но это не рекомендуется.

SELECT * FROM offers WHERE in_stores LIKE "%1002%".

Если у вас нет значений больше 9999, это будет работать. BUT Если у одного из ваших магазинов есть идентификатор 11002 из 99991002, он также вернет эти нежелательные значения.

Что вы должны сделать, это преобразовать таблицу mysql в другую таблицу storeLocations или sth. остальное. Это должно иметь только свойства offer_id и store_id. Это превратит ваши данные:

`offers` 
id | title 
1 | Shoes  
2 | Gloves 
3 | Shades 
4 | Hats  
5 | Shoes 
6 | Shirts 
7 | Hats  

`storeLocations` 
offer_id, store_id 
1  | 1002 
1  | 1003 
2  | 1020 
2  | 1011 
3  | 1002 
3  | 1009 
4  | 1010 
4  | 1002 
5  | 1220 
6  | 1010 
7  | 1002 

Затем вы можете выбрать из него, как

SELECT * FROM offers AS o 
    LEFT JOIN storeLocations as l ON (o.id=l.offer_id) 
    WHERE l.store_id = 1002; 

Теперь, когда вы вставляете данные, которые вы не должны использовать лопаются, но вставить столько строк в storeLocations, как есть store_id для этого конкретного элемента.

Дополнительную информацию по этой теме смотрите here.

Смежные вопросы