2010-11-26 8 views
4

Ich muss einige Elemente und seine Eigenschaften in Form eines Schlüssel-Wert-Paare in der Datenbank (mySQL) speichern. Ich plane es wie folgt zu tun.Benötigen Sie eine MySQL-Abfrage für die Auswahl aus einer Tabelle Schlüsselwert Paare speichern

Ich verwende zwei Tabellen items und item_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 

Nun, wenn ich Elemente auszuwählen, deren 'Wirkung' ist 'Kühlen', kann ich das mit folgenden Abfrage (was mir geben ' AC 'und' Kühlschrank 'im Ergebnis).

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

Ich würde gerne wissen, wie Sie Abfragen schreiben Elemente auszuwählen, die mehrere Eigenschaften wie

  • wählen Sie alle Elemente, deren ‚Wirkung‘ ist ‚Kühlen‘ und ‚Verbrauch‘ ist ‚effizient‘ (entsprechen die würde Artikel "AC" entsprechen).
  • Alle Elemente auswählen, deren Typ "Split" ist ODER "heatMethod" ist "Spule" ODER "Verbrauch" ist "effecient" (entspricht den Elementen "AC" und "Heater").

Bitte um Hilfe ... Vielen Dank im Voraus! Hier

Antwort

7

ist ein Beispiel Abfrage:

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

Ich werde die oR Abfrage als etwas verlassen Sie selbst ausprobieren können. Es fügt einfach weitere Tabellen hinzu und verwendet OR anstelle von AND im WHERE.

+0

Danke @WoLpH !! :) knackig und einfach ... – Goje87

2

Grüße!

Ich denke, Ihre ursprüngliche Abfrage ist vielleicht nicht richtig .. wenn Ihr item_properties Tabellenspalten genannt hat (itemId, Eigenschaft, Wert), dann sollten Sie Ihre Abfrage sein:

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

Auch Sie tun „implizite Joins "hier", und ich weiß nicht, wie viel Sie über SQL lernen möchten, anstatt nur etwas zum Laufen zu bringen, aber es gibt eine andere Möglichkeit, Ihre Abfragen zu schreiben, von denen ich denke, dass sie vielleicht besser sind mit SQL-Datenbanken für eine Weile. Es ist keine große Sache, nur dass die zweite Form für mich leichter zu lesen ist.

Ihre ursprüngliche Abfrage:

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

wäre neu geschrieben Syntax join as:

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

Ich werde versuchen, beide Formen in Antwort auf Ihre Fragen zu geben ...

Wählen Sie alle Elemente aus, deren "Effekt" "Kühlen" UND "Verbrauch" "Effizient" ist (was mit "AC" übereinstimmt).

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

wählen Sie alle Elemente, deren ‚Typ‘ ist ‚split‘ OR ‚heatMethod‘ ist ‚Spule‘ OR ‚Verbrauch‘ ist ‚effecient‘ (die ‚AC‘ Artikel passen würde und ‚Heizung‘).

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

Hoffe, dass hilft!

+0

Guter Fang @ extraplanetary. Ich habe meine Frage bearbeitet, um meine Anfrage zu korrigieren. – Goje87