【发布时间】: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',没有区别。
-
好吧,我在问之前看到了这个问题,但我不确定这是同一个问题。在我的情况下,只有一个连接,因此运算符优先级不起作用。