2014-01-20 4 views
1

У меня есть orders таблицы с количеством items, связанным с каждым заказом:Выбор элементов из списка, используя подстановочные знаки

id | ... | items 
-----+-----+----------------- 
34 | ... | 823, 27, 1657 
678 | ... | 957 
2548 | ... | 92, 823 

поле orders.items сохраняет содержимое как разделенный запятыми id «s текстового поля. (Я знаю, что дизайн неправильный, и должна быть таблица «один-ко-многим», чтобы связывать заказы с элементами, но я ее не проектировал).

нужно выбрать заказы на основе элементов, которые они содержат:

SELECT id, items FROM orders 
WHERE items LIKE IN (
    SELECT CONCAT('%',id,'%') FROM items 
    WHERE wishlist = 0 

но, очевидно, она не работает, потому что я не могу использовать LIKE в списке элементов, полученных из IN. Однако, это то, что я бы потребовал, потому что мне нужно было использовать % подстановочные знаки, чтобы их найти.

Как я могу это достичь?

EDIT:

В этом SQL Fiddle есть пример моего кода возвращающихся 7 строк и пропавшие без вести 2 из них, в котором функция FIND_IN_LIST имеет точно такое же влияние на результатах.

+1

'order' является зарезервированным словом в MySQL, поэтому, как написано, этот запрос не будет работать в любом случае. Но в корне ваша проблема - это нормализация (или ее отсутствие). FIND_IN_SET будет делать то, что вы хотите, но это плохой заменитель правильно нормированной базы данных. – Strawberry

+0

Я выбрал имя «заказ» только для иллюстрации - вы правы, я сделал неправильный выбор. Однако это не имя, которое я использую в своем проекте. – Jago

+0

У вас всегда есть 3 предмета в вашей строке? – Mihai

ответ

1

Попробуйте это:

SELECT DISTINCT o.id, o.items 
FROM orders AS o 
INNER JOIN items AS i ON FIND_IN_SET(i.id, REPLACE(o.items, ' ', '')) 
WHERE i.wishlist = 0 AND i.cost = 44800; 

Проверить это SQL FIDDLE DEMO

ВЫВОД

| ID |  ITEMS | 
|-----|------------| 
| 154 | 375, 374 | 
| 155 |  377 | 
| 159 |  384 | 
| 172 |  435 | 
| 174 |  440 | 
| 228 | 770, 769 | 
| 229 | 775,841 | 
| 230 |  777 | 
| 528 | 1518, 1517 | 
+0

Я получаю такие же результаты, как если бы я использовал обычный 'IN', а не' CONCAT' ... возвращенные результаты верны, но в любом случае результаты отсутствуют; не все результаты возвращаются. – Jago

+0

Из вашего описания проблемы это должно работать (за исключением того, что оно возвращает одну строку на элемент, за заказ - легко фиксируется). Не могли бы вы опубликовать скрипт SQL таблиц и немного тестовых данных, которые демонстрируют проблему? – Kickstart

+0

@Kickstart Как вы можете видеть в http://sqlfiddle.com/#!2/ffb8b/3/1 оба метода (мои и предлагаемые в этом ответе) возвращают 7 строк, а 2 остаются без результатов. – Jago

0
SELECT id, items FROM `order` WHERE id REGEXP REPLACE(items,',','|'); 

SQL Fiddle

Что делает это так, в основном расширенная версия LIKE, '|' является для или

select id, items FROM test WHERE id REGEXP '823|167|398'; 
+0

Я не очень уверен, как применить эту функцию REGEXP REPLACE к моему коду ... Не могли бы вы рассказать о моем коде на http://sqlfiddle.com/#!2/ffb8b/3/1? – Jago

+0

@Jago http://sqlfiddle.com/#!2/ffb8b/4 – Mihai

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