1

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注文)。

4

1 に答える 1

1

同じテーブルを別のエイリアスで再度結合するだけです。

SELECT j.*, c.Name AS CustomerName,
       ca.Content AS PhoneNumber,
       ca2.Content as CustomerInfo
FROM jobs j
INNER JOIN customers c ON j.Customer = c.ID
INNER JOIN customers_attributes ca ON (j.Customer = ca.ForeignCustomer)
INNER JOIN customers_attributes ca2 ON (j.Customer = ca2.ForeignCustomer)
WHERE j.ID = '$jobID' 
  AND ca.Type = 'PhoneNumber'
  AND ca2.Type = 'CustomerInfo'
LIMIT 1

警告
PHPを使用しているようです。大幅に改善されたライブラリではなく、古いライブラリの使用を主張する必要がある場合。を使用して引用することを忘れないでください。 そうでない場合は、SQLインジェクションの問題に隠れてしまいます。mysql_mysqli_mysql_real_escape_string()$vars

于 2013-02-10T10:36:59.063 に答える