【问题标题】:MySql join issue 3 tablesMySql join issue 3 表
【发布时间】:2011-10-15 04:50:10
【问题描述】:

我正在尝试加入 3 张桌子。项目、状态、客户。查询的 GOAL 应导致当前状态为“已接收”的所有项目。我还试图获取客户端名称以显示在结果表中。

这些表有共同的外键:client_ID、status_ID。

到目前为止,这是我的查询。我正在努力更好地理解连接。如果您可以提供有关我做错了什么的 cmets 以及将非常受欢迎的示例代码。

   SELECT clients.clientName, 
          clients.Client_ID, 
          projects.Client_ID,
          projects.projectNumber,
          projects.projectName, 
          projects.expectedDate,
          statuses.Status_ID, 
          statuses.status         
     FROM projects, 
          clients, 
          statuses 
LEFT JOIN clients on projects.Client_ID = clients.Client_ID 
LEFT JOIN statuses on projects.Status_ID = statuses.Status_ID 
    WHERE status = 'Received'

【问题讨论】:

  • 你能给我们提供你数据库的所有 3 个表结构吗?
  • 您正在混合使用 ANSI-89(FROM 子句中的逗号)和 ANSI-92 JOIN(JOIN 语法)语法。如果 WHERE 中没有标准,则 ANSI-89 内容是笛卡尔积。

标签: php mysql


【解决方案1】:

尝试使用“JOIN”而不是“LEFT JOIN”。还要删除 from 子句中的客户端和状态。我还会查询 Status_ID 而不是状态名称。

SELECT clients.clientName, 
          clients.Client_ID, 
          projects.Client_ID,
          projects.projectNumber,
          projects.projectName, 
          projects.expectedDate,
          statuses.Status_ID, 
          statuses.status         
     FROM projects
     JOIN clients on projects.Client_ID = clients.Client_ID 
     JOIN statuses on projects.Status_ID = statuses.Status_ID 
     WHERE statuses.status = 'Received'

【讨论】:

    【解决方案2】:

    您应该在 FROM 子句中只有一个表名,否则您将多次加入表(ANSI 语法)。此外,它有助于以相反的方式设置连接条件(我认为更容易阅读);并展开表名 (projects.status=...) 而不是 (status=...)。

    此外,如前所述,如果要返回“项目”行,则“JOIN”而不是“LEFT JOIN”将强制存在相应的行。

    SELECT clients.clientName, clients.Client_ID, projects.Client_ID,
           projects.projectNumber,projects.projectName, projects.expectedDate,
           statuses.Status_ID, statuses.status 
    
    FROM projects
    
    LEFT JOIN clients ON clients.Client_ID = projects.Client_ID 
    
    LEFT JOIN statuses ON statuses.Status_ID = projects.Status_ID
    
    WHERE statuses.status = 'Received'
    

    【讨论】:

    • 我认为 projects.status 不存在。
    • 抱歉,我扩展了错误的表名。编辑了答案:)
    【解决方案3】:

    试试下面的代码。

    删除 LEFT JOIN 并使用 WHERE 条件和 INNER JOIN...

    SELECT clients.clientName, 
              clients.Client_ID, 
              projects.Client_ID,
              projects.projectNumber,
              projects.projectName, 
              projects.expectedDate,
              statuses.Status_ID, 
              statuses.status         
         FROM projects, 
              clients, 
              statuses 
          WHERE 
              clients on projects.Client_ID = clients.Client_ID AND
              statuses on projects.Status_ID = statuses.Status_ID AND
              status = 'Received'
    

    这可能对您有所帮助,并记录您应该等待的内容。

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2013-04-19
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      相关资源
      最近更新 更多