2010-11-26 35 views
4

我需要在數據庫(mySQL)中以鍵值對的形式存儲少量項目及其屬性。我打算如下進行。需要一個MySQL查詢從存儲鍵值對的表中進行選擇

我將使用兩個表itemsitem_properties

items

 
itemId | itemName 
------------------- 
1923 | AC 
1235 | Fridge 
8273 | Heater 

item_properties

 
itemId | property | value 
-------------------------------- 
1923 | effect  | cooling 
1923 | consumption | efficient 
1923 | type  | split 
1235 | effect  | cooling 
1235 | volume  | 20 liters 
8273 | effect  | heating 
8273 | consumption | efficient 
8273 | heatMethod | coil 

現在,如果我有選擇項,它們的 '效果' 是 '冷卻',我能做到這一點使用下面的查詢(這會給我' AC'和'Fridge')。

 
SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId 
AND (p.property = 'effect' AND p.value ='cooling'); 

我想知道如何編寫查詢來選擇匹配多個屬性,如

  • 的項目選擇其「效果」是「冷」與「消費」的所有項目是「有效的」(這會匹配項目'AC')。
  • 選擇'type'爲'split'或'heatMethod'爲'coil'或OR'consumption'爲'effecient'(可匹配項目「AC」和「Heater」)的所有項目。

請幫助...提前致謝!

回答

7

下面是一個例子查詢:

SELECT 
    itemName 
FROM 
    items i, 
JOIN 
    item_properties effect 
    ON i.itemId = effect.itemId AND effect.property = 'effect' 
JOIN 
    item_properties consumption 
    ON i.itemId = consumption.itemId AND consumption.property = 'consumption' 

WHERE effect.value = 'cooling' AND consumption.value = 'efficient'; 

我將離開oR查詢的東西,你可以嘗試自己。這只是增加更多的表,並使用OR而不是在WHERE

+0

謝謝@WoLpH! :)爽脆簡單... – Goje87 2010-11-27 10:35:29

2

問候!

我想你的原始查詢也許是不對的..如果你item_properties表中有一個名爲列(的itemId,財產值),那麼您的查詢應該是:

SELECT i.itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling'; 

而且,你在做「隱加入「,而且我不知道你想學習多少SQL,而只是想讓某些東西起作用,但還有另一種編寫查詢的方式,我認爲如果你打算堅持,可能會更好與SQL數據庫一段時間。這沒什麼大不了的,只是第二種形式更容易閱讀。

原始查詢:

SELECT itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND p.property='cooling'; 

會使用連接語法被改寫:

SELECT i.itemName FROM items i 
JOIN item_properties p ON i.itemId=p.itemId WHERE p.property='cooling'; 

我會盡量回答你的問題,給這兩種形式...

選擇「效應」爲「冷卻」且「消耗」爲「有效」(其將與「AC」匹配)的所有項目。

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND (p.property='cooling' AND p.value='consumption'); 

select i.itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE p.property='cooling' AND p.value='consumption'; 

選擇其「類型」是「分裂」 OR「heatMethod」爲「線圈」 OR「消費」是「effecient」(這將匹配項的AC「和「加熱器」)的所有項目。

select itemName FROM items i, item_properties p 
WHERE i.itemId=p.itemId AND ((p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient')); 

select itemName FROM items i JOIN item_properties p ON i.itemId=p.itemId 
WHERE (p.property='type' AND p.value='split') OR 
(p.property='heatMethod' AND p.value='coil') OR 
(p.property='consumption' AND p.value='efficient'); 

希望幫助!

+0

好抓@extraplanetary。我編輯了我的問題來糾正我的查詢。 – Goje87 2010-11-27 10:37:01

相關問題