2010-11-26 34 views
4

Je dois stocker quelques éléments et ses propriétés sous forme de paires de valeurs clés dans la base de données (mySQL). Je prévois de le faire comme suit. Je vais utiliser deux tables items et item_properties.Besoin d'une requête MySQL pour la sélection à partir d'une table stockant des paires de valeurs clés

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 

Maintenant, si je dois sélectionner les éléments dont 'l'effet' est 'refroidissement', je peux le faire en utilisant la requête suivante (qui me donnera ' AC 'et' Fridge 'dans le résultat).

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

Je voudrais savoir comment écrire des requêtes pour sélectionner des éléments qui correspondent à plusieurs propriétés comme

  • sélectionner tous les éléments dont « l'effet » est « refroidissement » et la « consommation » est « efficace » (qui correspondrait à l'élément 'AC').
  • Sélectionnez tous les articles dont le 'type' est 'split' OU 'heatMethod' est 'coil' OU 'consommation' est 'effecient' (qui correspondrait aux items 'AC' et 'Heater').

Veuillez nous aider ... Merci d'avance!

Répondre

7

Voici un exemple de requête:

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

Je vais laisser la requête oR comme quelque chose que vous pouvez essayer vous-même. C'est simplement en ajoutant plus de tables et en utilisant OR au lieu de AND dans le WHERE.

+0

Merci @WoLpH !! :) croustillant et simple ... – Goje87

2

Salutations!

Je pense que votre requête d'origine est peut-être pas droit .. si votre table item_properties a des colonnes nommées (itemId, propriété, valeur), votre requête doit être:

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

, vous aussi faites « implicite joint "ici, et je ne sais pas combien vous voulez apprendre sur SQL vs simplement vouloir faire quelque chose pour travailler, mais il y a une autre façon d'écrire vos requêtes que je pense est peut-être mieux si vous prévoyez de coller avec des bases de données SQL pendant un moment. Ce n'est pas grave, juste que la deuxième forme est plus facile à lire pour moi.

Votre requête originale:

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

serait-être réécrite en utilisant la syntaxe de jointure comme:

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

Je vais essayer de donner aux deux formes en réponse à vos questions ...

sélectionner tous les éléments dont 'l'effet' est 'refroidissement' AND 'consommation' est 'efficace' (qui correspondrait à l'élément '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'; 

sélectionner tous les éléments dont le « type » est « divisé » OU « heatMethod » est « bobine » OU « consommation » est « effecient » (ce qui correspond articles de l'AC »et « Chauffage »).

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

Hope that helps!

+0

Bonne prise @explanétaire. J'ai modifié ma question pour corriger ma requête. – Goje87