繁体   English   中英

多个内部联接擦除属性

[英]Multiple Inner Join erase attributes

我有2张桌子:

相册(idalbum,idauthor,idcompositor,idfeat)

人(身份证,名字,姓氏)

我的查询

SELECT * FROM albums  a
INNER JOIN people p ON a.idauthor = p.id
INNER JOIN people p1 ON a.idcompositor = p1.id
INNER JOIN people p2 ON a.idfeat = p2.id
where a.idalbum=:id

我想要的是 :

Album,
p[First Name, Last Name],
p1[First Name, Last Name],
p2[First Name, Last Name]

我的问题 :

当我使用print_r查询时,我只有一个名字和一个姓氏,即“ p2”值。

预先感谢您:)

SELECT a.*, 
   CONCAT(p.firstname, ' ', p.lastname) AS Author,  
   CONCAT(p1.firstname, ' ', p1.lastname) AS Composer, 
   CONCAT(p2.firstname, ' ', p2.lastname) AS Featured FROM albums a
INNER JOIN people p ON a.idauthor = p.id
INNER JOIN people p1 ON a.idcompositor = p1.id
INNER JOIN people p2 ON a.idfeat = p2.id
where a.idalbum=:id

然后,您将可以访问“作者”,“作曲家”和“精选”,以及所有专辑属性

您的问题是每个列都具有相同的名称。 当您的结果转换为PHP数组时,后面的列将使用相同的索引/列名称覆盖第一列。 您必须为每个列赋予唯一的标识符,以访问每个单个值。

SELECT *, p.firstname as p_firstname, p.lastname AS p_lastname,
p1.first_name AS p1_firstname, [...]
FROM albums  a
INNER JOIN people p ON a.idauthor = p.id
INNER JOIN people p1 ON a.idcompositor = p1.id
INNER JOIN people p2 ON a.idfeat = p2.id
where a.idalbum=:id

作为替代方案,您可以使用另一种访存样式,该样式将按其列号插入列。 (如果您使用的是PDO,请参见http://www.php.net/manual/zh/pdostatement.fetch.php

您也只需将其他字段添加到查询结果中: a.*,p.*,p1.*,p2.*

SELECT a.*,p.*,p1.*,p2.* FROM albums  a
INNER JOIN people p ON a.idauthor = p.id
INNER JOIN people p1 ON a.idcompositor = p1.id
INNER JOIN people p2 ON a.idfeat = p2.id
where a.idalbum=:id

对于其他数据库(例如ORACLE),您的原始查询甚至无法使用,因为*如果没有指定星号属于哪个表(例如a.* ),则不允许*与多个表结合使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM