2013-01-31 170 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 |