将两列连接到一列

时间:2014-01-10 04:55:57

标签: mysql sql select group-by max

我有一张表格来定义'连接'和另一个定义设备'

我有一个' source_system_name'连接表中的'destination_system_name'列和。{ 和"system_name""equipment"表中匹配的1. Core 2. Aggregation 3. Customer.

设备可以是各种类型:

id | Source Name | Source port | Destination Name | Destination Port | etc...
-----------------------------------------------------------------------------
4    Device_core1  1/1           Device_agg3        3/4

我正在尝试定义一个查询以返回" type"来自设备表的源和目标字段。

连接表如​​下:

id | Equip_name   | Equip type | etc....
------------------------------------------
3    Device_core1 | Core
7    Device_agg3  | Aggregation 

设备表就像:

id | Source Name |Source port|Source type|Destination Name|Destination Port|Destination type|
---------------------------------------------------------------------------------------------
1   Device_core1  1/1         Core        Device_agg3      3/4              Aggregation  

我试图将结果返回如下:

SELECT DISTINCT * FROM connections 
LEFT JOIN equipment on connections.system_name_source=equipment.system_name 
OR connections.system_name_dest=equipment.system_name;

我尝试使用的查询是:

Source type

当我这样做时,我得到双记录,其中Destination type字段被equipment覆盖,反之亦然。 我是否可以使用查询来查找id | Source Name |Source port|Source type|Destination Name|Destination Port|Destination type| 1 Device_core1 1/1 Aggregation Device_agg3 3/4 Aggregation 2 Device_core1 1/1 Core Device_agg3 3/4 Core 表中的源数据和目标数据? 即,

{{1}}

2 个答案:

答案 0 :(得分:2)

您需要进行自我加入..尝试此查询:

SELECT 
connections.id,
connections.Source_Name,
connections.Source_port,
src.systype SourceType,
connections.Destination_Name,
connections.Destination_Port,
tgt.systype DestinationType
FROM connections 
LEFT JOIN equipment src on connections.system_name_source=src.system_name 
LEFT JOIN equipment tgt on connections.system_name_dest=tgt.system_name 

在上面的查询中,我将equipment表别名为srctgt

答案 1 :(得分:1)

试试这个:

SELECT c.id, c.sourceName, c.sourcePort, 
       MAX(IF(c.sourceName = e.Equip_name, e.equipType, '')) sourceType, 
       c.destinationName, c.destinationPort, 
       MAX(IF(c.destinationName = e.Equip_name, e.equipType, '')) destinationType
FROM `connection` c
LEFT JOIN equipment e ON e.Equip_name IN (c.sourceName, c.destinationName) 
GROUP BY c.id;