3つの異なるテーブルがあり、そのうちの2つから1回、3番目から2回データをプルする必要があります。テーブルは、、、jobs
およびcustomers
ですcustomers_attributes
。特定のジョブのデータを取得しようとしていますが、そのデータの一部は、ジョブを所有している顧客に関する情報です。顧客データはcustomers_attributes
、データのタイプがタイプに対応する整数として定義されている場所に格納され(ここでは簡単にするために文字列を使用)、コンテンツフィールドにはデータ自体が含まれます。
この場合、customers_attributes
ジョブに対応する顧客に対応するテーブルから2つの行をプルする必要があります。'PhoneNumber'の1つの行、および'CustomerInfo'の別の行。一方にはINNERJOINを使用しましたが、両方にWHERE値を設定できないため、もう一方にはサブクエリを使用しました。これは本当に厄介だと思います。もっとクリーンな方法が必要だと確信しています。
SELECT jobs.*, customers.Name AS CustomerName,
customers_attributes.Content AS PhoneNumber,
( SELECT `Content`
FROM customers_attributes
WHERE Type = 'CustomerInfo' AND ForeignCustomer = jobs.Customer
LIMIT 1) AS CustomerInfo
FROM jobs
INNER JOIN customers ON jobs.Customer = customers.ID
INNER JOIN customers_attributes ON jobs.Customer = customers_attributes.ForeignCustomer
WHERE jobs.ID = $jobID AND customers_attributes.Type = 'PhoneNumber'
LIMIT 1
顧客が複数のジョブを持っている場合、同じ属性に対して複数の行を持つ可能性があることを言及する必要があります。このクエリは、理想的には、最新の情報、またはジョブと同時に送信された情報(対応するものに基づく)のいずれかを返す必要があります。 ID注文)。