2010-09-20 5 views
1

je vraiment surpris quand j'ai essayé sous le code MySQL:Mysql complexe où l'article

SELECT * FROM table WHERE (key='free_shipping' and value='yes') AND (key='price' and value='5') 

Il ne fonctionne pas. J'ai besoin d'obtenir un produit qui est à la fois free_shipping est 'oui' ET prix égale '5' en même temps. Comment puis-je créer cette requête correctement?

Tableau Structure:

contenu: (TABLEAU 1)

CONTENT_ID TITLE DESCRIPTION DATE 

content_fields: (TABLEAU 2)

FIELD_ID CONTENT_ID KEY_NAME VALUE 

Exemple (Get produit qui a 1 ID et son envoi est GRATUIT):

SELECT * FROM `contents` as c LEFT JOIN `content_fields` as cf ON c.content_id = cf.content_id WHERE c.content_id = 1 AND cf.key_name = 'free_shipping' AND cf.value = 'yes' 
+0

est la clé membre de la table "table"? La clé ne peut pas être à la fois "free_shipping" et "price". – halfdan

+3

Si votre 'table' ne consomme que des valeurs-clés et est utilisée pour le stockage de données" réel ", cela ressemble à un gros problème de conception. – DrColossos

Répondre

6

Votre requête en cours est contradictoire comme une ligne unique ne peut jamais correspondre à la clause WHERE. Je suppose que vous voulez quelque chose comme ça.

SELECT product_id 
FROM table 
WHERE (key='free_shipping' and value='yes') or (key='price' and value='5') 
GROUP BY product_id 
HAVING COUNT(DISTINCT key) = 2 
+0

c'est incroyable :) vraiment merci - cela fonctionne. – dino

1

Les parenthèses ne changent pas le sens de cette déclaration. Sans eux, vous avez:

key='free_shipping' and value='yes' and key='price' and value='5' 
=> 
key='free_shipping' and key='price' 
=> 
nothing! 

essayer WHERE free_shipping='yes' AND price='5'

modifier: ferraille, je suis maintenant complètement confus par votre table. Est-ce juste une charge de paires clé/valeur? Pourrions-nous voir la structure de la table?

+0

Vous pouvez vérifier ci-dessus la structure de table – dino

5

Essayez ceci:

WHERE free_shipping='yes' AND price='5' 

ou:

WHERE free_shipping=yes AND price=5 

si les champs ne sont pas des chaînes

+2

+1 pour comprendre cette question totalement énigmatique. – halfdan

+0

@halfdan - Je ne suis pas d'accord qu'il a. Je pense que le PO demande comment faire une requête de division relationnelle sur une table de type EAV. –

+0

non, cela ne fonctionne pas :(parce que free_shipping et le prix ne sont pas sur le terrain, ils sont des valeurs – dino

1

Pour obtenir les titres de produits qui ont la livraison gratuite et une valeur de 5 ....... sélectionnez x.TITLE distinct de contenus x, y content_fields, content_fields z où x.CONTENT_ID = y .CONTENT_ID et y.CONTENT_ID = z.CONTENT_ID et y.key_name = 'free_shipping' et y.value = 'oui' et z.key_name = 'prix' et z.value = '5'