模糊的`id`字段

时间:2009-06-01 15:26:19

标签: mysql innodb

我有以下两个表:

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;

7 个答案:

答案 0 :(得分:5)

5.0.77上测试:


SELECT  VERSION();

VERSION()
5.0.77


CREATE TABLE organization (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `officeSymbol` VARCHAR(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
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;

INSERT
INTO   organization
VALUES
        (1, 'Organization 1'),
        (2, 'Organization 2');
INSERT
INTO     system
VALUES  (1, 'System 1', 1),
        (2, 'System 2', 2);
SELECT  system.systemName, organization.officeSymbol
FROM    system
LEFT JOIN
        (organization)
ON      (system.idOrganization = organization.id);

systemName      officeSymbol
System 1        Organization 1
System 2        Organization 2

一切正常。

请注意LEFT JOIN在这里没用,因为您有FOREIGN KEYorganization,并且每个给定organization总会有system

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

  

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

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

您确定查询确实是错误的吗?如果你把它削减为SO,你可能已经删除了这个bug。

答案 3 :(得分:0)

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

SELECT
    [system].[systemName],
    [organization].[officeSymbol]
FROM
    [system]
LEFT OUTER JOIN
    [organization]
ON
    [system].[idOrganization] = [organization].[id]

答案 4 :(得分:0)

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

...
ON (system.`idOrganization` = organization.`id`)

答案 5 :(得分:-1)

你试过了吗?

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

这应该正确地将表连接在一起,即使并非所有系统都分配给组织。

答案 6 :(得分:-1)

我觉得你得到那个错误似乎很奇怪(虽然我的主要经验不是用mysql)。我会尝试别名你的表。

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