【问题标题】:Whats wrong with my join?我的加入有什么问题?
【发布时间】:2012-10-04 20:59:14
【问题描述】:

简化的数据库设置

表:客户 字段:clientId(autoinc/primary)、customerId、clientName

表:项目 字段:projectId(autoinc/primary)、customerId、projectName

表:项目 字段: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 个。 错误:在非对象上调用执行

提前感谢大家

-------更新

感谢大家的帮助!我实际上是通过使用这个查询让它工作的:

        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 个相同的值,那就太好了。

【问题讨论】:

  • 您要检索哪些数据?鉴于您的陈述,您希望获取 customerId,但也直接传递 customerId

标签: php join mysqli


【解决方案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

【讨论】:

  • 谢谢伙计,我试过了,但仍然不能让它产生任何东西。同样的错误。基本上,如果我要查询 SELECT customerId FROM clients WHERE customerId= 135,它将产生一个结果:135。如果我要为其他表(项目和客户)切换表的名称,它们将分别产生相同的一个结果(135) 但我想产生 135 135 135 以便我知道我从每个表中得到一个结果。
  • 您的表必须经过规范化才能正确构造查询。我只是说明连接表的用法,查询可能不起作用。
【解决方案2】:

我可能遗漏了一些东西,但您没有明确加入查询中的任何位置。相反,每列的每一行都将与其他表的每一行连接。

如果你有三个包含 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 .

【讨论】:

    【解决方案3】:

    你应该在你的表上指定连接条件,像这样

    SELECT customerId 
         FROM items i, projects p, clients c
         WHERE i.customerId = p.customerId AND p.customerId = c.customerId 
            AND customerId= 135
    

    以上合并表中具有相等customerId的行

    【讨论】:

      【解决方案4】:
          SELECT clients.customerId, projects.customerId, items.customerId 
          FROM clients, projects, items 
          WHERE  clients.customerId = projects.customerId AND   
          projects.customerId = items.customerId;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-06
        相关资源
        最近更新 更多