1

我有 3 个不同的表,我需要从其中 2 个中提取数据一次,从第三个中提取两次。这些表是jobscustomerscustomers_attributes。我正在尝试为特定工作提取数据,其中部分数据是有关拥有该工作的客户的信息。客户数据存储在customers_attributes数据类型定义为与类型对应的整数的位置(为简单起见,此处使用字符串),然后内容字段包含数据本身。

customers_attributes在这种情况下,我需要从与工作对应的客户对应的表中提取 2 行。'PhoneNumber' 的一行,'CustomerInfo' 的另一行。我对其中一个使用了 INNER JOIN,但是因为我不能为两者放置 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

我应该提一下,如果客户有超过 1 个工作,则同一属性可能有多个行,理想情况下,此查询应该返回最新信息,或者与工作同时提交的信息(基于相应的身份证件)。

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。如果您必须坚持使用过时的mysql_库而不是改进很多的mysqli_库。请记住使用mysql_real_escape_string()并引用您的$vars.
否则,您将被 SQL 注入问题所掩盖。

于 2013-02-10T10:36:59.063 回答