2013-08-01 47 views
0

我有一个SQL SELECT语句,我在其中使用3个表。 我使用INNER JOIN来连接表,但是我遇到了一些问题,因为我希望连接有条件的两列是不同的数据类型; 一个是整数 - 产品表的id,可以在下面看到p.id。 另一个是这些ID在订单表中的逗号分隔的字符串。客户一次可以订购多个产品,因此产品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"; 

也许我可以使用正则表达式?目前逗号分隔的列表显示为'2,1,3' - 但是字符数量不受限制 - 所以我需要一个条件来检查我的产品ID(p.id)是否在o.product_id的列表中?

回答

0

你有什么是一对多关系的完美例子,你有一个订单和几个项目附加到它。你应该有一个链接表像

order_product - 这使得订单ID和产品ID,你也可以把具体的数据,两者之间(比如当添加了项,数量等)的关系

之间的连接

然后你使用这个表进行连接,并且你到处都有相同的字段类型。

简单的例子:

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如在elanoism的答案中解释。

坏事™

我你不能或不想做,你可能要依靠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,非常详细的答案:) –