2009-07-22 5 views
2

J'ai deux tables, l'une appelée customer et l'autre customer_attributes. L'idée est que la table client contient les données client de base et que l'application peut être personnalisée pour prendre en charge des attributs supplémentaires en fonction de la façon dont elle est utilisée.Récupération d'une ligne, avec des données provenant d'une table de paire clé-valeur dans MySQL

customer_attributes a les 3 colonnes suivantes:

customerID 
key1 
value1 

Puis-je récupérer la ligne complète, avec tous les attributs supplémentaires si spécifié, par défaut NULL sinon? J'utilise la requête suivante, mais cela ne fonctionne que si les deux attributs existent dans la table customer_attributes.

SELECT `customer`.*, `ca1`.`value1` AS `wedding_date`, `ca2`.`value1` AS `test` 
FROM `customer` 
LEFT JOIN `customer_attributes` AS `ca1` ON customer.customerID = ca1.customerID 
LEFT JOIN `customer_attributes` AS `ca2` ON customer.customerID = ca2.customerID 
WHERE (customer.customerID = '58029') 
    AND (ca1.key1 = 'wedding_date') 
    AND (ca2.key1 = 'test') 

Dans ce cas, les deux attributs qui me intéressent sont appelés « wedding_date » et « test »

Répondre

4

Essayez ceci:

SELECT `customer`.*, `ca1`.`value1` AS `wedding_date`, `ca2`.`value1` AS `test` 
FROM `customer` 
LEFT JOIN `customer_attributes` AS `ca1` ON customer.customerID = ca1.customerID AND ca1.key1='wedding_date' 
LEFT JOIN `customer_attributes` AS `ca2` ON customer.customerID = ca2.customerID AND ca2.key1='test' 
WHERE (customer.customerID = '58029') 

Déplacement du 2 WHERE conditions sur CA1/ca2 dans la place condition join devrait trier

+0

Un grand merci à vous trois pour les réponses - Ada obtient la tique d'être le premier. Une différence subtile dont je n'avais pas conscience! –

1

Les tests « clés » dans la LEFT OUTER JOIN prédicats, en tant que tel:

SELECT `customer`.*, `ca1`.`value1` AS `wedding_date`, `ca2`.`value1` AS `test` 
FROM `customer` 
LEFT JOIN `customer_attributes` AS `ca1` ON customer.customerID = ca1.customerID 
    AND (ca1.key1 = 'wedding_date') 
LEFT JOIN `customer_attributes` AS `ca2` ON customer.customerID = ca2.customerID 
    AND (ca2.key1 = 'test') 
WHERE (customer.customerID = '58029') 
2

Les lignes de raison sont uniquement renvoyées en raison des tests dans la clause WHERE. Toutes les lignes qui n'ont pas la bonne clé1 sont complètement ignorées - annulant votre LEFT JOIN.

Vous pouvez déplacer les tests cle1 à vos conditions JOIN

SELECT `customer`.*, `ca1`.`value1` AS `wedding_date`, `ca2`.`value1` AS `test` 
FROM `customer` 
LEFT JOIN `customer_attributes` AS `ca1` ON customer.customerID = ca1.customerID AND ca1.key1 = 'wedding_date' 
LEFT JOIN `customer_attributes` AS `ca2` ON customer.customerID = ca2.customerID AND ca2.key1 = 'test' 
WHERE (customer.customerID = '58029') 
Questions connexes