2

2つのテーブルがあります。1つはと呼ばれ、もう1つはcustomerと呼ばれcustomer_attributesます。

アイデアは、customerテーブルがコア顧客データを保持し、アプリケーションをカスタマイズして、使用方法に応じて追加の属性をサポートできるようにすることです。

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

この場合、私が興味を持っている2つの属性は、「wedding_date」と「test」と呼ばれます。

4

3 に答える 3

4

これを試して:

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つのWHERE条件をJOIN条件に移動するとソートされます

于 2009-07-22T10:31:43.603 に答える
2

行のみが返される理由は、WHERE句のテストによるものです。正しいkey1を持たない行は完全に無視され、LEFTJOINが否定されます。

key1テストを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') 
于 2009-07-22T10:31:21.530 に答える
1

「キー」は、LEFTOUTERJOIN述語でテストされます。

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') 
于 2009-07-22T10:31:10.703 に答える