MySQL Join与表名中的dot相对应

时间:2017-11-15 17:25:50

标签: php mysql

在旧客户端脚本的再现过程中,我遇到了一个问题。 他们在数据库中有两个表,名为“content.articles”和“content.categories”

    SELECT content.articles.*, content.categories.id as category_id
    FROM `content.articles`
    INNER JOIN `content.categories`
    ON content.articles.category=content.articles.id

我知道问题是表名中的点。 我该如何正确选择?

我试过了:

    SELECT content.articles.*
    SELECT `content.articles`.*
    SELECT `content.articles.*`

这些选项都不起作用。

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

SQL允许在表名中包含点或其他标点或甚至空格,但只要在查询中使用它们,就必须“分隔”标识符。

这是不寻常的,不建议在表名中使用点,因为很容易将其与databasename.tablename syntax for qualified tables混淆。

如果你在C ++中有一个名为Foo::Bar的变量就好了。阅读代码的人会是这样的:等等,是类中的Bar Foo?或者它是一个字面上称为Foo :: Bar的变量?为什么在这个世界上你会做这样的事情!?!

您可以使用标识符分隔符来解决此类奇怪的表名。并且每次引用那种表名时,必须使用分隔符。

答案 1 :(得分:1)

如果FROM子句中的表引用是正确的,那么您尝试的第二个表单应该是有效的...将整个标识符括在反引号中。 e.g。

SELECT `content.articles`.*
  FROM `content.articles`

反引号允许许多不稳定的字符,否则这些字符将被解释为SQL文本的一部分并抛出错误。

SELECT `ab.d@ AND '0'`.*
  FROM `ab.d@ AND '0'`
       ^             ^

我对FROM子句中的表引用有点怀疑。点分隔符用于数据库名称和表名称之间。如果表名为articles且位于content数据库中,则不应将标识符组合在反引号内。在这种情况下,我们从SELECT列表中的列名中省略了数据库限定符。

如果articlescontent数据库中的表格,那么我们就是这样做的

SELECT `articles`.*
  FROM `content`.`articles`
       ^       ^ ^        ^

一个方便的模式是为表分配一个别名,并使用它来限定列引用。下面是一个为表引用分配别名ca的示例,并使用ca.限定SELECT列表中的列引用:

SELECT ca.*
  FROM `content`.`articles` ca
       ^       ^ ^        ^