0

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

这是我在 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 列表中?

4

2 回答 2

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
于 2013-08-01T12:45:50.967 回答
0

这是使用遗留数据库时非常常见的噩梦之一。

规则很简单:永远不要在一个表列中存储多个值。这被称为第一范式

但是如何在现有数据库中处理呢?

好东西™</h1>

如果您有机会重构您的数据库,请将“逗号分隔值”提取到他们自己的表中。有关如何执行此操作的基本示例,请参见http://sqlfiddle.com/#!2/0f547/1 。

然后查询表s你将不得不使用JOINelanoism 的答案中解释的 a 。

坏事™</h1>

我不能或不想这样做,您可能必须依赖该FIND_IN_SET功能。

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

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

顺便说一句,为什么这是坏事™?因为如您所见,编写针对多值列的查询并不容易——但可能更重要的是,您无法在该列上使用索引,因此也无法轻松执行连接操作或强制引用正直。

马马虎虎™</h1>

最后一点,如果可能的值集很小(小于 65),另一种方法是将列类型更改为 a SET()

于 2013-08-01T13:36:55.153 回答