La récupération d'une rangée, avec les données de clé-valeur table de paires de MySQL

StackOverflow https://stackoverflow.com/questions/1164350

  •  18-09-2019
  •  | 
  •  

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 »

Était-ce utile?

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') 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top