4

我有以下两个表:

system
- id
- systemName
- idOrganization

organization
- id
- officeSymbol

我正在运行以下查询并收到一个id不明确的错误:

SELECT system.systemName, organization.officeSymbol
FROM system
LEFT JOIN (organization)
ON (system.idOrganization = organization.id)

如您所见,我没有选择id列。如果我放置system.id在要选择的字段列表中,我将不再收到此错误。不幸的是,处理这些数据的方式我无法返回id——我们不希望它显示给用户。

此外,如果我添加GROUP BY system.systemName我不再收到错误 - 但这似乎不是最佳解决方案。

注意:这LEFT JOIN是有意的,因为并非所有系统都将分配给一个组织。

SELECT VERSION()
--> 5.0.77-community-log

CREATE TABLE system (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `systemName` VARCHAR(45) DEFAULT NULL,
  `idOrganization` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_system_organization` (`idOrganization`),
  CONSTRAINT `fk_system_organization` 
    FOREIGN KEY (`idOrganization`) 
    REFERENCES `organization` (`id`) 
    ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE organization (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `officeSymbol` VARCHAR(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
4

7 回答 7

5

测试5.0.77

选择版本();

版本()
5.0.77


CREATE TABLE 组织 (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `officeSymbol` VARCHAR(45) 默认为空,
  主键(`id`)
) 引擎=InnoDB 默认字符集=latin1;
创建表系统(
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `systemName` VARCHAR(45) 默认为空,
  `idOrganization` INT(11) 默认 NULL,
  主键(`id`),
  KEY `fk_system_organization` (`idOrganization`),
  约束`fk_system_organization`
    外键(`idOrganization`)
    参考`组织`(`id`)
    ON DELETE NO ACTION ON UPDATE NO ACTION ON 更新 NO ACTION ON DELETE NO ACTION ON UPDATE NO ACTION
) 引擎=InnoDB 默认字符集=latin1;

插入
INTO组织
价值观
        (1, '组织 1'),
        (2, '组织 2');
插入
INTO系统
值(1,“系统 1”,1),
        (2, '系统 2', 2);
选择 system.systemName,organization.officeSymbol
从系统
左连接
        (组织)
开(system.idOrganization = organization.id);

系统名称办公室符号
系统 1 组织 1
系统 2 组织 2

一切正常。

请注意,这LEFT JOIN在这里没有用,因为您有一个FOREIGN KEYto ,并且对于每个给定organization的 总是有一个。organizationsystem

在您对@Artem Barger的帖子的评论中,您说:

我只选择这 2 个表之间共享的 42 个字段中的 5 个

表和/或查询中是否还有其他字段?

由于您有语法错误,因此每个逗号都可能很重要。

于 2009-06-01T15:47:17.733 回答
1

我不确定发生了什么,因为我对 mySql 不够熟悉,但我总是更喜欢将列命名为 SystemID 和 OrganizationID,而不是一般意义上的“ID”。

以这种方式命名您的列,将导致具有相同名称的 PK-FK 组合:

bad PK-FK names       good PK-FK names
system                system
  id                    SystemID
  systemName            systemName
  idOrganization        OrganizationID  <--

organization          organization
  id                    OrganizationID  <--
  officeSymbol          officeSymbol
于 2009-06-01T15:29:11.690 回答
1

不知道为什么您的查询会生成:通常您会在执行此操作时收到该错误消息:

SELECT id /* This should have been qualified with system. or organization. */
FROM system
LEFT JOIN (organization)
ON (system.idOrganization = organization.id)

您确定该查询确实给了您该错误吗?如果您将其修剪为 SO,您可能已经消除了该错误。

于 2009-06-01T15:44:52.990 回答
0

迈克尔,将 id 放在单引号 (`) 中(或像 SQL Server 中的方括号,或任何适用于 mysql 的方括号)有助于解决问题吗?

...
ON (system.`idOrganization` = organization.`id`)
于 2009-06-01T16:22:12.020 回答
0

我真的不知道mysql,只知道sqlserver,但是,当使用像“id”这样的字段名和像“system”这样的表名时,我一定要像这样将所有表名和列名括起来。可能值得一试?

SELECT
    [system].[systemName],
    [organization].[officeSymbol]
FROM
    [system]
LEFT OUTER JOIN
    [organization]
ON
    [system].[idOrganization] = [organization].[id]
于 2009-06-01T15:38:53.007 回答
-1

你有没有尝试过:

SELECT system.systemName, organization.officeSymbol
FROM system, organization
WHERE system.idOrganization = organization.id

即使不是所有系统都分配给一个组织,这也应该将这些表正确地连接在一起。

于 2009-06-01T15:34:10.620 回答
-1

对我来说,你会得到那个错误似乎很奇怪(尽管我的主要经验不是 mysql)。我会尝试给你的表起别名。

SELECT s.systemName, o.officeSymbol
FROM system as s
LEFT JOIN (organization as o)
ON (s.idOrganization = o.id)
于 2009-06-01T15:43:11.850 回答