mysql - 选择主表中包含两个不同索引的行到另一个表上的记录

标签 mysql sql

鉴于这两个表,其中 containers 中的 idcontypeidinfcontypecontypes 中的 id 相关。 我需要一个查询,该查询返回一个 containers 行,其中包含 idcontypeidinfcontypedescrip 列。

--
-- 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 中的

idcontypeidinfcontypecontypes 中的 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/

相关文章:

sql - 在生产环境中部署 Sql Server Reporting Services 报告

sql - Google 查询 - "NOT LIKE"语句不起作用

sql - 在 Swift 中通过 SQLClient 从 SQL Server 提取数据

java.io.StreamCorruptedException : invalid stream header: 626F6775 using mysql blob, java对象和自定义对象

asp.net - 使用 SQL 身份验证对 ASP.NET Web 应用程序进行 SQL 数据审核

sql - postgresql 中的 EXECUTE 语法错误

mysql - 引用下一行和上一行值

mysql - karaf + pax-jdbc 连接池已达到限制

php - 比较2个表中的2个字段并提取数据

php - mysql小表中的ID