2013-03-08 2 views
1

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

У меня есть 2 таблицы, первый называется порядок, второй order_items.

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

Table orders 

id  sell_price  buy_price 
0001 50    20 


Table order_items 

id  sell_price  buy_price 
0001-1 30    15 
0001-2 20    5 

Я попытался создать запрос, который будет в состоянии возвратить все детали для заказывайте 0001, используя LIKE, возвращающие предметы заказа 0001-1 и 0001-2.

SELECT 
o.id AS order_id, 
oi.id AS order_item_id, 
oi.sell_price AS order_item_sell_price, 
oi.buy_price AS order_item_buy_price 
FROM orders o, order_items oi 
WHERE oi.id LIKE o.id + '%' 
ORDER BY o.purchase_date DESC 

Результаты не возвращаются!

Проблема, похоже, связана с утверждением LIKE, я думал, что это правильный способ объявить об этом, но я думаю, что нет, любая помощь будет оценена по достоинству.

ответ

1

Лучше выйти идентификатор ORDER из идентификатора ORDER_ITEMS в другой столбец ORDER_ID в ORDER_ITEMS. Причина в том, что вы можете индексировать столбец ORDER_ID, что заставляет ваш SQL-запрос работать быстрее.

+0

Я вас не понимаю, вы говорите, что я должен создать другой столбец в order_items, например 'parent_id', который будет быть тем же идентификатором, что и в таблице «Заказы»? –

+0

Да. Схема таблицы ORDER_ITEMS будет id, order_id, sell_price и buy_price. Строка будет 0001-1, 0001, 30 и 15. – fajarkoe

+0

Я сделал это вчера, должен был подумать об этом раньше, спасибо –

2

Попробуйте использовать CONCAT:

SELECT 
o.id AS order_id, 
oi.id AS order_item_id, 
oi.sell_price AS order_item_sell_price, 
oi.buy_price AS order_item_buy_price 
FROM orders o, order_items oi 
WHERE oi.id LIKE CONCAT(o.id, '%') 
ORDER BY o.purchase_date DESC 

И вы все еще можете использовать JOIN, если вы хотите:

SELECT 
o.id AS order_id, 
oi.id AS order_item_id, 
oi.sell_price AS order_item_sell_price, 
oi.buy_price AS order_item_buy_price 
FROM orders o 
JOIN order_items oi on oi.id LIKE CONCAT(o.id, '%') 
ORDER BY o.purchase_date DESC 

упрощенный sqlfiddle: http://sqlfiddle.com/#!2/e6b12/6

+0

Будет, можно использовать concat с соединением –

+0

@ mk_89, ваш исходный запрос уже делает неявное соединение. Нет разницы в обоих запросах, упомянутых darkajax –

+1

Да не должно быть никаких проблем – DarkAjax

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