2009-07-22 7 views
2

私はcustomerと呼ばれるものとcustomer_attributesと呼ばれるものの2つのテーブルを持っています。MySQLのキーと値のペアテーブルからデータを取得する行

顧客テーブルにコア顧客データが保存され、アプリケーションの用途に応じて追加の属性をサポートするようにアプリケーションをカスタマイズすることができます。

customer_attributesは、次の3つの列があります。指定した場合

customerID 
key1 
value1 

は私がいない場合はNULLをデフォルト、任意の追加の属性で、完全な行を取得することはできますか?私は次のクエリを使用していますが、両方の属性が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') 

私は「wedding_date」と「テスト」

答えて

4

にKEY1テストを動かすことができます:

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

が結合条件にCA1/CA2上の条件ではなく、それを

を並べ替える必要がある2を移動します
+0

あなたの3人すべてに感謝の言葉をいただきました。私が気づいていなかった微妙な違い! –

1

LEFT OUTERとの「キー」テストと呼ばれていることに興味が二つの属性は、次のような、結合述部:

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

行が返されるのは、WHERE句のテストのためです。正しいkey1を持たない行はすべて無視されます - LEFT 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')