鉴于这两个表,其中 containers
中的 idcontype
和 idinfcontype
与 contypes 中的
。
我需要一个查询,该查询返回一个 id
相关containers
行,其中包含 idcontype
和 idinfcontype
的 descrip
列。
--
-- Table structure for table `containers`
--
`id` int(11) NOT NULL AUTO_INCREMENT,
`idarticle` int(11) NOT NULL,
`idzone` int(3) NOT NULL DEFAULT '1',
`idcontype` int(11) NOT NULL DEFAULT '1',
`idinfcontype` int(11) NOT NULL DEFAULT '0',
--
-- Table structure for table `contypes`
--
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` char(1) COLLATE utf8_spanish_ci NOT NULL,
`code` varchar(2) COLLATE utf8_spanish_ci NOT NULL,
`level` tinyint(1) NOT NULL,
`descrip` varchar(16) COLLATE utf8_spanish_ci NOT NULL,
containers
中的 idcontype
和 idinfcontype
与 contypes
中的 id
相关
idcontype
始终与 contypes
中的 id
相关,但 idinfcontype
可能是 0
此查询生成三行,其中包含重复行
SELECT DISTINCT * FROM
(SELECT `containers`.`id`,`idarticle`,`idcontype`,`descrip` FROM `containers` JOIN `contypes` ON containers.idcontype=contypes.id
UNION
SELECT `containers`.`id`,`idarticle`,`idinfcontype`,`descrip` FROM `containers` JOIN `contypes` ON containers.idinfcontype=contypes.id
) CT
Rows: 3
id idarticle idcontype descrip
1 2 1 PACKAGE
2 2 2 BOX
2 2 1 PACKAGE
经过一番努力,此查询产生了所需的结果:
SELECT * FROM `containers`
JOIN
(SELECT DISTINCT id AS idc FROM
(SELECT `containers`.`id`,`idarticle`,`idcontype`,`descrip` FROM `containers` JOIN `contypes` ON containers.idcontype=contypes.id
UNION
SELECT `containers`.`id`,`idarticle`,`idinfcontype`,`descrip` FROM `containers` JOIN `contypes` ON containers.idinfcontype=contypes.id
) CT ) CTD
ON containers.id=idc
id idarticle idcontype descrip
1 2 1 PACKAGE
2 2 2 BOX
有没有更简单的方法?
最佳答案
通常,您可以使用左连接
来实现此目的:
SELECT c.*, ct.descrip, ctinf.descrip as infdescrip
FROM containers c LEFT JOIN
contypes ct
on c.idcontype = ct.id LEFT JOIN
contypes ctinf
on c.idinfcontype = ctinf.id;
除了左连接
之外,此查询:
- 使用表别名。在本例中需要这些,因为查询在
from
子句中两次使用同一个表。 - 使用列别名来区分两列。
- 不使用反引号。这些不是必需的,我认为它们会使查询更难以阅读和编写。
关于mysql - 选择主表中包含两个不同索引的行到另一个表上的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25832343/