【问题标题】:Multiple Inner Join erase attributes多个内连接擦除属性
【发布时间】:2014-05-02 09:56:24
【问题描述】:

我有 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”值。

提前谢谢你:)

【问题讨论】:

    标签: php mysql sql inner-join


    【解决方案1】:
    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
    

    然后您将能够访问作者、作曲家和精选,以及所有专辑属性

    【讨论】:

      【解决方案2】:

      您的问题是每列都有相同的名称。当您的结果转换为 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
      

      作为替代方案,您可以使用另一种 fetch 样式,它按列号将列插入到数组中。 (如果您使用 PDO,请参阅http://www.php.net/manual/en/pdostatement.fetch.php

      【讨论】:

        【解决方案3】:

        您只需将其他字段也添加到查询结果中: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.*),则不允许将 * 与多个表结合使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-03
          • 2015-08-26
          • 1970-01-01
          • 2016-12-09
          相关资源
          最近更新 更多