2013-01-31 130 views
0

我有item_data具有下列列和值在这个表名:MySQL的:SELECT查询

id | name |value | price | matching_item 
1 | item1| 5 | 1500 | NULL 
2 | item2| 6 | 1700 | NULL 
3 | item3| 4 | 500 | item1 
4 | item3| 8 | 2000 | NULL 

我使用了一个选择查询:

SELECT * from `item_data` WHERE (value = 4) AND (price > 100); 

然后它给我造成这样的:

id | name | value | price | matching_item 
3 | item3| 4 | 500 | item1 

,但我希望有一个查询这给我造成这样的:

id | name | value | price | matching_item 
3 | item3| 4 | 500 | item1 
1 | item1| 5 | 1500 | NULL 

我想要配对结果。

+0

你的意思是 “配对结果”?基于哪些属性和条件你想选择项目? – tttthomasssss

+1

我可以给你一堆将返回给定结果的查询,但逻辑在哪里? –

+0

一串匹配物品可以存在多久?它可以去item4-> item1-> item3-> item99 .....可能会出现循环匹配的项目,即去item1-> item3-> item4? –

回答

0

也许你只需要改变你的条件:

SELECT * from item_data WHERE value IN (4,5) AND (price > 100) 
+0

需求非常模糊。 – Kermit

0

没有真正理解你的问题(请详细描述),我的猜测是你想在你找到的结果加入matching_item列回名列并返回该行与发现的结果?

如果是的话,可以考虑使用UNION得到您想要的结果:

SELECT i.* 
FROM Item_Data i 
    LEFT JOIN Item_Data i2 on i.matching_item = i2.name 
WHERE i.value = 4 and i.price > 100 
UNION 
SELECT i2.* 
FROM Item_Data i 
    INNER JOIN Item_Data i2 on i.matching_item = i2.name 
WHERE i.value = 4 and i.price > 100 

而且Fiddle

这里是没有UNION一种不同的方法:

SELECT i3.* 
FROM Item_Data i 
    LEFT JOIN Item_Data i2 on i.matching_item = i2.name 
    LEFT JOIN Item_Data i3 on i3.id in (i.id, i2.id) 
WHERE i.value = 4 and i.price > 100 

而且Fiddle

0

好像你想要这个:

select * 
from item_data i 
where exists (select * 
       from item_data d 
       WHERE 
       (
       value = 4 
       AND price > 100 
       and i.id = d.id 
      ) 
       or i.name = d.matching_item); 

SQL Fiddle with Demo

返回结果:

| ID | NAME | VALUE | PRICE | MATCHING_ITEM | 
---------------------------------------------- 
| 1 | item1 |  5 | 1500 |  (null) | 
| 3 | item3 |  4 | 500 |   item1 |