简化数据库设置
表:客户端 fields:clientId(autoinc / primary),customerId,clientName
表:项目 fields:projectId(autoinc / primary),customerId,projectName
表:项目 fields:itemId(autoinc / primary),customerId,itemName
查询:
include('includes/conn.inc.php');
$query = "SELECT customerId
FROM items, projects, clients
WHERE customerId= 135";
$stmt = $mysql->prepare ($query);
$stmt->execute();
$stmt->bind_result($customerId);
while($row = $stmt->fetch()) :
echo $customerId;
endwhile; $stmt->close();
问题:查询有什么问题?温柔,我试图第一次找出联接。我尝试了一些不同的方法,但不能让它们中的任何一个工作,这个似乎是我想做的最简单和最明确的解释。每个表上都有一个对应的条目(customerId = 135),所以如果查询有效,我希望它返回3个。 错误:在非对象上调用execute
感谢大家提前
-------更新
感谢大家的帮助!我实际上通过使用此查询来实现它:
SELECT clients.customerId, projects.customerId, items.customerId
FROM clients, projects, items
WHERE clients.customerId = projects.customerId AND
projects.customerId = items.customerId;
虽然那种看起来很笨重但特别是最后。如果有人知道“WHERE table.column = table.column = table column的简写,那么考虑到它们都是3个相同的值就会很好。
答案 0 :(得分:1)
好吧,没有加入。您需要在至少中定义这些表之间的隐式关系,如下所示:
SELECT customerId
FROM items, projects, clients
WHERE clients.customerId = projects.customerId
AND items.customerId = projects.customerId
AND clients.customerId= 135
但是,你应该像这样使用显式连接:
SELECT client.customerId
FROM clients
LEFT JOIN projects ON projects.customerId = clients.customerId
LEFT JOIN items ON items.customerId = clients.customerId
WHERE clients.customerId = 135
答案 1 :(得分:0)
我可能会遗漏某些内容,但您并未明确加入查询中的任何位置。相反,每列的每一行都将与其他表的每一行连接。
如果您有三个包含abc,123和!@#的表格,您将获得
a 1 !
a 1 @
a 1 #
a 2 !
...
要正确加入,您需要做更像
的事情select customerId
from clients c
join project p on p.customerId = c.id
join items i on i.customerId = c.id
where customerId = 135;
但是,鉴于您为客户ID提供了where子句并且还选择了客户ID,您将获得返回count(p)* count(i)行,每行只包含客户ID 135
答案 2 :(得分:0)
你应该在表上指定连接条件,比如
SELECT customerId
FROM items i, projects p, clients c
WHERE i.customerId = p.customerId AND p.customerId = c.customerId
AND customerId= 135
合并来自具有相等customerId
答案 3 :(得分:0)
SELECT clients.customerId, projects.customerId, items.customerId
FROM clients, projects, items
WHERE clients.customerId = projects.customerId AND
projects.customerId = items.customerId;