La récupération d'une rangée, avec les données de clé-valeur table de paires de MySQL
Question
J'ai deux tables, l'un appelé customer
et un appelé customer_attributes
.
L'idée est que la table des clients contient des données des clients de base, et l'application peut être personnalisé pour supporter des attributs supplémentaires en fonction de la façon dont il est utilisé.
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 il 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 »
La solution
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 conditions WHERE sur CA1 / ca2 dans la condition join à la place doivent trier
Autres conseils
Les lignes ne sont retournées raison est à cause des tests dans la clause WHERE. Toutes les lignes qui ne sont pas le key1 correct sont ignorées tout à fait -. Nier 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')
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')