【问题标题】:MySQL Inner Join 2 tablesMySQL内连接2表
【发布时间】:2012-03-01 19:12:04
【问题描述】:
SELECT *
FROM tableA a
INNER JOIN tableB b
ON  a.someColumn = b.otherColumn
INNER JOIN tableC c
ON b.anotherColumn = c.nextColumn

如果 tableA 和 tableB 在字段中具有相同的名称怎么办?如何使用:

<?
$name = mysql_fetch...
echo $name['a.title'] . ' ' . $name['b.title'];
?>

所以我可以从 tableA 中获取标题,从 tableB 中获取标题。因为现在,如果只使用 $name['title'] 它会返回 tableA 的标题。不幸的是,上面的代码只给出了一个空字符串。

【问题讨论】:

  • 它可能会帮助您命名您想要的列,而不是使用*

标签: php mysql inner-join


【解决方案1】:

除了select *,您也可以在列上添加别名。

SELECT a.title AS 'a_title', b.title AS 'b_title'
-- ...

那么你的 PHP 会是这样的:

$name['a_title']

【讨论】:

  • 38 秒,没有橙色警告栏。德拉斯! ;p
  • 也许值得解释一下为什么不使用SELECT *
  • 如果我需要检索所有字段? @马修
  • 你必须把它们都写出来,如果其余的列包含冗余数据(a.foo=b.foo),那么你可以懒惰地做SELECT a.*, b.title AS 'b_title', c.title AS 'c_title', ...,写出你的列want 明确将消除可能因具有相似列名而产生的任何歧义。即使我认为列名将是唯一的,我也总是这样做,因为它可以抵抗数据库架构更改(即表“b”获得一个名称为表“a”包含的新列)。如果您不需要全部,也总是指定列名将减少发送的数据量。
【解决方案2】:

使用别名

SELECT  a.title AS TitleA,
        b.title AS TitleB,
        ...

来自...

然后引用别名:

$name['TitleA']

【讨论】:

    【解决方案3】:

    停止使用SELECT *

    明确列出您的列,然后您可以根据需要为它们设置别名。

    SELECT a.title AS TableATitle, b.title AS TableBTitle, ...
    

    【讨论】:

      【解决方案4】:

      您必须按名称调出字段,而不是使用 SELECT *。执行此操作时,您可以为每个分配一个别名。

      SELECT a.title AS aTitle, b.title AS bTitle, etc...
      

      【讨论】:

        【解决方案5】:
        SELECT *, a.title as atitle, b.title as btitle
        FROM tableA a
        INNER JOIN tableB b
        ON  a.someColumn = b.otherColumn
        INNER JOIN tableC c
        ON b.anotherColumn = c.nextColumn
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          • 2015-05-30
          • 1970-01-01
          • 1970-01-01
          • 2011-12-26
          相关资源
          最近更新 更多