【问题标题】:MySQL joins, how to output relation "the proper way"MySQL连接,如何以“正确的方式”输出关系
【发布时间】:2010-11-09 12:07:06
【问题描述】:

首先,请原谅我糟糕的主题标题。我根本不知道如何提出这个问题或谷歌之后的内容,所以如果这很容易回答,请不要开枪。

假设我有以下表格:

[作者] id,姓名

[NEWS] id、item、author_id

如果我想显示一条新闻并输出相应的作者(存储在 author_id 中),我会执行以下查询:

SELECT * FROM `news` JOIN `authors` ON news.author_id = authors.id

然后通过做这样的事情输出它

$Q = "SELECT * FROM news JOIN authors ON news.author_id=news.id";

$query = $this->lite->query($Q) or die($this->lite->error); 

$result=null; while($obj = $query->fetch_object()){
        $result.= '<li>'.$obj->item. 'by ' . $obj->name . '</li>';
}

这里,$obj->name 会包含作者的名字,并且会成功输出。

那么,如果将“name”字段改为“item”会发生什么?显然会有一些冲突。以我以前在 Propel 和 symfony 方面的经验,我会做这样的事情:getAuthorId()->getName() - 但是对于这个项目,我需要从头开始编写 SQL。

【问题讨论】:

  • 你能提供更多关于你的班级的细节吗?它是否正在获取对象中的所有参数?

标签: php sql database join database-relations


【解决方案1】:

切勿在生产代码中使用* 语法。

将您的查询重写为:

SELECT  news.item AS news_item, author.name AS author_name
FROM    `news`
JOIN    `authors`
ON      news.author_id = authors.id

,根据需要对字段进行别名以避免命名冲突。

【讨论】:

  • 非常感谢!这成功了。当然,这不是生产代码 :-)
【解决方案2】:

您需要使用限定名称,例如 news.item 或 authors.item。

【讨论】:

    【解决方案3】:

    您明确命名它们

    SELECT  n.id, n.item, n.author_id,a.name,a.id 
    FROM 
    `news` as n JOIN `authors` as a 
    ON 
    n.author_id = n.id
    

    ;

    或者更像

    SELECT  n.id as newsid, n.item as newsitem, n.author_id as autohor_authorid,
    a.name as authorname,a.id as authorid 
    FROM 
    `news` as n JOIN `authors` as a 
    ON 
    n.author_id = n.id;
    

    您应该只提取您实际需要的列。 select * 被认为是不好的风格,总是命名您感兴趣的列,或者如果例如,很容易破坏代码。另一列被添加到表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多