【问题标题】:Trouble with NATURAL JOIN in PHP/PDO/SQLite3PHP/PDO/SQLite3 中的 NATURAL JOIN 问题
【发布时间】:2014-01-15 14:20:22
【问题描述】:

在我的 PHP5.3 环境中,“NATURAL JOIN”语法似乎不能很好地工作。 我使用 PDO 访问 SQLite3 引擎。

参见下面的示例,我想在其中存储用户的各种访问权限:

CREATE TABLE user (
    id_u  integer PRIMARY KEY,
    name  text);

CREATE TABLE access (
    id_a    integer PRIMARY KEY,
    id_u    integer,
    area    text,
    granted text,
    FOREIGN KEY(id_u) REFERENCES user(id_u));

经过一些说明,表格包含以下内容:

id_u  name
---- ------
1    Igor
2    Rebecca  

id_a id_u area    granted
---- ---- ------- -------
1    1    kitchen full
2    2    kitchen restricted
3    1    lab     forbidden

现在如果我执行这个查询:

SELECT granted FROM user U 
    INNER JOIN access A USING (id_u) 
    WHERE U.name='Igor' and A.area='kitchen';

我得到了预期的结果 (full)

但是,这个查询:

SELECT granted FROM user U 
    NATURAL INNER JOIN access A
    WHERE U.name='Igor' and A.area='kitchen';

没有结果。

第二个查询有什么问题吗,或者 PDO 和/或 SQLite3 在这里表现得很好?

编辑:根据要求,我添加了SQLfiddle 来演示问题

它可以在 SQLite 的两种变体下工作,但在我自己的环境中却失败了。具体的 PDO 接口、SQLite 版本或我发送请求的方式是否有问题,我不知道。如果能提供一点帮助,我们将不胜感激。

【问题讨论】:

  • 如果你尝试:SELECT right FROM user U NATURAL JOIN access A WHERE U.name='Igor' and A.area='kitchen';
  • 访问表的区域属性在 DDL 中指定为整数,但在查询中用作字符串
  • 对不起,在我的实际应用程序中它是一个整数,我只是在示例中将它更改为一个字符串,以便更清楚一点。我编辑了这个问题以删除这个错字。至于使用'NATURAL JOIN'而不是'NATURAL INNER JOIN',没有区别。
  • 好吧,我在问之前看到了这个问题,但我不确定这是同一个问题。在我的情况下,只有一个连接,因此运算符优先级不起作用。

标签: php sqlite


【解决方案1】:

用 MySql 试过这个(必须使用 rright,因为它是关键字):

CREATE TABLE user (
id_u  integer PRIMARY KEY,
name  varchar(255) UNIQUE NOT NULL);

CREATE TABLE access (
id_a  integer,
id_u  integer,
area  varchar(55),
rright varchar(55),
primary key(id_a),
foreign key(id_u) references user(id_u)
);

这相当于标准 SQL 中的第二个查询:

select rright
from user u, access a
where u.id_u=a.id_u and u.name='Igor' and a.area='kitchen';

结果是:

+--------+
| rright |
+--------+
| full   |
+--------+
1 row in set (0.00 sec)

【讨论】:

  • 这个语法很好用,但据我所知,INNER JOIN 和 NATURAL JOIN 也是标准 SQL,对吧?
  • 我不确定它是否是标准的,但它应该可以正常工作。我通常应用自然连接作为对笛卡尔积(数据库术语)的限制。没有意识到您的问题是专注于让自然加入发挥作用
  • 嗯,根据各种第二来源(因为实际的文档必须在日内瓦购买),NATURAL 可以追溯到 ISO SQL-92。我在使用另一种语法变体时几乎没有问题,但我很惊讶没有提到这个明显损坏的关键字(可能只在 PHP/PDO 上下文中),同时 SQLite 自己的教程声称它就像一个魅力。
  • 提醒我有人要惩罚一个学生,因为他没有在 MySql DDL 代码中放置域检查约束,只是为了听听:但是 MySql 先生不强制执行检查约束,所以为什么还要放它呢?
  • 在学生添加检查后:“恭喜年轻人,你的代码不起作用,但根据书籍应该”:)。现在认真的人......
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2011-02-10
相关资源
最近更新 更多