【发布时间】:2014-02-09 11:37:39
【问题描述】:
我有一个orders 表,其中包含与每个订单相关的items:
id | ... | items
-----+-----+-----------------
34 | ... | 823, 27, 1657
678 | ... | 957
2548 | ... | 92, 823
字段orders.items 将内容存储为以逗号分隔的id 的文本字段。 (我知道设计是错误的,应该有一个一对多的表来链接订单和商品,但我没有设计它。
我需要根据订单中包含的商品选择订单:
SELECT id, items FROM orders
WHERE items LIKE IN (
SELECT CONCAT('%',id,'%') FROM items
WHERE wishlist = 0
但显然它不起作用,因为我不能在从IN 获得的项目列表中使用LIKE。
但是,这正是我需要的,因为我需要使用 % 通配符来查找它们。
我怎样才能做到这一点?
编辑:
在这个 SQL Fiddle 中有一个我的代码示例返回 7 行并缺少其中 2 行,其中 FIND_IN_LIST 函数具有完全相同的效果关于结果。
【问题讨论】:
-
order是 MySQL 中的保留字,因此,正如所写,此查询在任何情况下都不起作用。但从根本上说,您的问题是标准化(或缺乏标准化)之一。 FIND_IN_SET 会做你想做的事,但它不能替代正确规范化的数据库。 -
我选择“订单”这个名字只是为了说明——你是对的,我选错了。但是,这不是我在项目中使用的名称。
-
你的字符串中总是有 3 个项目吗?
-
@Mihai 不,这只是一个例子。可以是1,可以是2,可以是N...
-
这真的很难,你需要一个 mysql 的爆炸函数。我认为你会更好地进行规范化。