我有一个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
但显然它不起作用,因为我无法在LIKE
获得的项目列表中使用IN
。
但是,这就是我需要的,因为我需要使用%
通配符来查找它们。
我怎样才能做到这一点?
修改:
在此 SQL Fiddle 中,有一个示例,我的代码返回7行,缺少其中2行,其中FIND_IN_LIST
函数包含对结果的影响完全相同。
答案 0 :(得分:1)
试试这个:
SELECT DISTINCT o.id, o.items
FROM orders AS o
INNER JOIN items AS i ON FIND_IN_SET(i.id, REPLACE(o.items, ' ', ''))
WHERE i.wishlist = 0 AND i.cost = 44800;
<强>输出强>
| ID | ITEMS |
|-----|------------|
| 154 | 375, 374 |
| 155 | 377 |
| 159 | 384 |
| 172 | 435 |
| 174 | 440 |
| 228 | 770, 769 |
| 229 | 775,841 |
| 230 | 777 |
| 528 | 1518, 1517 |
答案 1 :(得分:0)
SELECT id, items FROM `order` WHERE id REGEXP REPLACE(items,',','|');
这就像这样,基本上是LIKE的高级版本,'|'用于或
select id, items FROM test WHERE id REGEXP '823|167|398';