使用通配符从列表中选择项目

时间:2014-01-20 10:36:16

标签: mysql sql select concat

我有一个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函数包含对结果的影响完全相同。

2 个答案:

答案 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;

选中此SQL FIDDLE DEMO

<强>输出

|  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,',','|');

SQL Fiddle

这就像这样,基本上是LIKE的高级版本,'|'用于或

select id, items FROM test WHERE id REGEXP '823|167|398';