2013-08-01 1 views
0

У меня есть оператор SQL SELECT, в котором я использую 3 таблицы. Я использую INNER JOINs, чтобы присоединиться к таблицам, однако я столкнулся с некоторой проблемой, потому что два из столбцов, на которые я хотел бы установить условие соединения, - это разные типы данных; Одним из них является целое число - идентификатор таблицы продуктов и можно увидеть ниже как p.id. Другое - это строка с разделителями-запятыми из этих идентификаторов в таблице заказов. клиенты могут заказывать более одного продукта за раз, поэтому идентификатор продукта хранится в виде списка с разделителями-запятыми.MYSQL JOIN Условно, чтобы проверить целое число с разделителем-запятой

вот насколько я получил с SQL:

"SELECT o.transaction_id, o.payment_status, o.payment_amount, o.product_id, o.currency, o.payment_method, o.payment_time, u.first_name, u.last_name, u.email, p.title, p.description, p.price 
FROM orders AS o 
INNER JOIN products AS p ON (NEED HELP HERE--> p.id IN o.product_id comma delimited list) 
INNER JOIN users AS u ON (o.user_id = u.id) 
WHERE user_id = '39' 
ORDER BY payment_time DESC 
LIMIT 1"; 

Возможно, я мог бы использовать Regex? в настоящее время список с разделителями-запятыми читается как «2,1,3» - однако количество символов не ограничено - так что мне нужно условие, чтобы проверить, находится ли мой идентификатор продукта (p.id) в этом списке o.product_id?

ответ

0

У вас есть прекрасный пример отношений «один ко многим», где у вас есть один заказ и несколько предметов, прикрепленных к нему. Вы должны иметь таблицу связей как

order_product - что делает связь между OrderID и ProductID, где вы можете поставить конкретные данные для связи между двумя (например, когда элемент был добавлен, количество и т.д.)

Затем вы делаете соединение, используя эту таблицу, и у вас одинаковые типы полей во всем мире.

простой пример:

select 
    /* list of products */ 
from 
    order o, 
    order_product op, 
    product p 
where 
    o.id = 20 
and o.id = op.orderid 
and op.productid = p.id 
+0

Спасибо за этот почтовый ящик, вы правы с одним для многих .. Мне просто нужна другая таблица для хранения этих деталей. Спасибо за вашу помощь по этому поводу :) –

0

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

Правило прост: никогда не храните несколько значений в одном столбце таблицы. Это называется first normal form.

Но как бороться с этим в существующей БД?

Хорошая вещь ™

Если у вас есть возможность реорганизовать БД, извлечения «разделенных запятыми значений» их собственным столом. См. http://sqlfiddle.com/#!2/0f547/1 для базового примера, как это сделать.

Затем для запроса таблицы s вам необходимо использовать JOIN, как объясняется в ответе эланоизма.

Плохая вещь ™

я вы не можете или не хотите сделать это, вы, вероятно, придется полагаться на функцию FIND_IN_SET.

SELECT * FROM bad WHERE FIND_IN_SET(target_value, comma_separated_values) > 0; 

См http://sqlfiddle.com/#!2/29eba/2

Кстати, почему это плохо ™? Поскольку, как вы видите, непросто написать запрос против многозначных столбцов, но, что более важно, вы не можете использовать индекс в этих столбцах и, как следствие, легко выполнять операции объединения или принудительно ссылаться на ссылочные целостность.

Так так, что ™

В качестве последнего замечания, если множество возможных значений мало (менее 65), альтернативный подход будет изменить тип столбца к SET().

+0

Спасибо за ссылки и полезную информацию Sylvain, очень подробный ответ :) –

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