我的加入有什么问题?

时间:2012-10-04 20:59:15

标签: php join mysqli

简化数据库设置

表:客户端 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个相同的值就会很好。

4 个答案:

答案 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;