2014-01-20 204 views
1

我有一个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。 但是,这是我所需要的,因为我需要使用%通配符来查找它们。

我该如何做到这一点?

EDIT

在这种SQL Fiddle有我的代码返回7行和缺少其中2,其中FIND_IN_LIST函数对结果完全相同的效果的例子。

+1

'order'是MySQL中的一个保留字,因此,正如所写,此查询在任何情况下都不起作用。但从根本上说,你的问题是正常化(或缺乏)的问题。 FIND_IN_SET会做你想做的,但它是一个很好的替代正常规范化的数据库。 – Strawberry

+0

我只是为了说明的目的而选择了“订单”这个名字 - 你是对的,我做了错误的选择。但是,这不是我在我的项目中使用的名称。 – Jago

+0

你的字符串中总是有3个项目吗? – Mihai

回答

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 | 
+0

实际上,我得到的结果与我刚使用普通的'IN'和没有'CONCAT'的结果相同......返回的结果是正确的,但是结果仍然丢失;并不是所有的结果都被返回。 – Jago

+0

从你对这个问题的描述中可以得出结论(除了它会为每个订单带来一行,每个订单都很容易修复)。你可以发布一个SQL小提琴表格和一些测试数据来证明这个问题吗? – Kickstart

+0

@Kickstart正如你可以在http://sqlfiddle.com/#!2/ffb8b/3/1中看到的,这两种方法(我的和这个答案中提出的)都返回7行,并且2个从结果中遗漏。 – Jago

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'; 
+0

我不是很确定如何将这个'REGEXP REPLACE'函数应用于我的代码中...请问您可以根据http://sqlfiddle.com/#!2/ffb8b/3/1上的代码进行详细说明吗? – Jago

+0

@Jago http://sqlfiddle.com/#!2/ffb8b/4 – Mihai