2011-03-15 90 views
0

我需要结合以下查询的结果。我需要将内部和外部的总消息一起处理。让我来解释查询和数据对他们MYSQL结合多个子查询的结果

样本数据:

+---------------------+---------------------+----------------+---------------+----------------+ 
| deviceCustomString2 | destinationUserName | deviceHostName | deviceProduct | sourceUserName | 
+---------------------+---------------------+----------------+---------------+----------------+ 
| <FD54>    | [email protected]  | gemslab385mb | Test Server | Exchange  | 
| <FX54>    | [email protected]  | gemslabcht  | Test Server | Exchange  | 
| <FZ54>    | [email protected]  | gemslab385mb | Test Server | External  | 
| <FA54>    | [email protected]  | gemslab385mb | Test Server | Exchange  | 
| <FD54>    | [email protected]  | gemslab385mb | Test Server | Exchange  | 
+---------------------+---------------------+----------------+---------------+----------------+ 

查询1:

SELECT 
LEFT((LOWER(SUBSTRING_INDEX(b.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(b.deviceHostName,'.',1))-2)) as "Device_Group", 
COUNT(b.deviceCustomString2) as "Total_Messages_Processed_EXTERNAL" 
FROM 
     (SELECT      
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
     FROM 
        TEST2 
     WHERE 
        TEST2.deviceProduct="Test Server" 
     AND 
        (TEST2.destinationUserName NOT LIKE '%dmroot.net%' 
       AND TEST2.destinationUserName NOT LIKE '%banco2%' 
       AND TEST2.sourceUserName NOT LIKE '%Exchange%') 
     GROUP BY 
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
       ) as b 

查询1结果:

+--------------+-----------------------------------+ 
| Device_Group | Total_Messages_Processed_EXTERNAL | 
+--------------+-----------------------------------+ 
| gemslab385 |         1 | 
+--------------+-----------------------------------+ 

QUERY2:

SELECT 
LEFT((LOWER(SUBSTRING_INDEX(a.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(a.deviceHostName,'.',1))-2)) as "Device_Group", 
    COUNT(a.deviceCustomString2) as "Total_Messages_Processed_INTERNAL" 
FROM 
     (SELECT      
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
     FROM 
        TEST2 
     WHERE 
        TEST2.deviceProduct="Test Server" 
    AND 
        (
        TEST2.destinationUserName LIKE '%dmroot.net%' 
       OR TEST2.sourceUserName LIKE '%Exchange%' 
       ) 
     GROUP BY 
        TEST2.deviceCustomString2 


       ) as a 

GROUP BY 
Device_group 

查询2结果:从两个查询

+--------------+-----------------------------------+ 
| Device_Group | Total_Messages_Processed_INTERNAL | 
+--------------+-----------------------------------+ 
| gemslab385 |         2 | 
| gemslabc  |         1 | 
+--------------+-----------------------------------+ 

结果都很好,并删除重复记录。

现在,当我添加UNION ALL 2个查询之间我得到这样的结果

+--------------+-----------------------------------+ 
| Device_Group | Total_Messages_Processed_EXTERNAL | 
+--------------+-----------------------------------+ 
| gemslab385 |         1 | 
| gemslab385 |         2 | 
| gemslabc  |         1 | 
+--------------+-----------------------------------+ 

总量是正确的,但不能显示TOTAL_MESSAGES_PROCESSED_INTERNAL。我如何使它输出如下:

+--------------+-----------------------------------+-----------------------------------+ 
| Device_Group | Total_Messages_Processed_INTERNAL | Total_Messages_Processed_EXTERNAL | 
+--------------+-----------------------------------+-----------------------------------+ 
| gemslab385 |         2 |         1 | 
| gemslabc  |         1 |         | 
+--------------+-----------------------------------+-----------------------------------+ 

在此先感谢您的帮助。

Marcello

+0

只需尝试UNION DISTINCT而不是UNION ALL。 – Vijay 2011-03-15 05:14:21

回答

1

准备列表内部的选择,算上团体有条件在外部选择。

SELECT 

    LEFT(LOWER(t.deviceGroup), LENGTH(t.deviceGroup) - 2) AS "Device_Group", 

    COUNT(DISTINCT 
    CASE 
     WHEN t.destinationUserName NOT LIKE '%dmroot.net%' AND 
      t.destinationUserName NOT LIKE '%banco2%' AND 
      t.sourceUserName NOT LIKE '%Exchange%' 
     THEN CONCAT(t.deviceCustomString2, '.', t.deviceHostName) 
    END) AS "Total_Messages_Processed_EXTERNAL", 

    COUNT(DISTINCT 
    CASE 
     WHEN t.destinationUserName LIKE '%dmroot.net%' OR 
      t.sourceUserName LIKE '%Exchange%' 
     THEN CONCAT(t.deviceCustomString2, '.', t.deviceHostName) 
    END) AS "Total_Messages_Processed_INTERNAL" 

FROM (
    SELECT 
    deviceCustomString2, 
    deviceHostName, 
    SUBSTRING_INDEX(a.deviceHostName, '.', 1) AS deviceGroup, 
    destinationUserName, 
    sourceUserName 
    FROM TEST2 
    WHERE deviceProduct="Test Server" 
) AS t 

GROUP BY Device_Group 

当计数组时,我使用这个构造:CONCAT(t.deviceCustomString2, '.', t.deviceHostName)。您更了解您的数据,因此可能会将该表达式简单地更改为t.deviceCustomString2t.deviceHostName,但请注意DISTINCT关键字。

此外,为了帮助稍微进行计算,我将SUBSTRING_INDEX(a.deviceHostName, '.', 1)移至内部SELECT,因此它不会评估两次。

+0

谢谢。这工作。只是一个小小的调整 – Marcello 2011-03-15 14:14:15

0

你想要的不是一个真正的联合,它只是一个普通的联接。这里有一个例子,但我没有测试过的语法,所以可能需要一些调整,它的工作原理之前:

(SELECT 
LEFT((LOWER(SUBSTRING_INDEX(b.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(b.deviceHostName,'.',1))-2)) as "Device_Group", 
COUNT(b.deviceCustomString2) as "Total_Messages_Processed_EXTERNAL", COUNT(a.deviceCustomString2) as "Total_Messages_Processed_INTERNAL" 
FROM 
     (SELECT      
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
     FROM 
        TEST2 
     WHERE 
        TEST2.deviceProduct="Test Server" 
     AND 
        (TEST2.destinationUserName NOT LIKE '%dmroot.net%' 
       AND TEST2.destinationUserName NOT LIKE '%banco2%' 
       AND TEST2.sourceUserName NOT LIKE '%Exchange%') 
     GROUP BY 
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
       ) as b LEFT JOIN 
     (SELECT      
        TEST2.deviceCustomString2, 
        TEST2.deviceHostName 
     FROM 
        TEST2 
     WHERE 
        TEST2.deviceProduct="Test Server" 
    AND 
        (
        TEST2.destinationUserName LIKE '%dmroot.net%' 
       OR TEST2.sourceUserName LIKE '%Exchange%' 
       ) 
     GROUP BY 
        TEST2.deviceCustomString2 


       ) as a ON a.deviceCustomString2 = b.deviceCustomString2 AND a.deviceHostName = b.deviceHostName 

GROUP BY 
Device_group 
+0

谢谢。我无法让JOIN正常工作。 “ON a.deviceCustomString2 = b.deviceCustomString2 AND a.deviceHostName = b.deviceHostName”似乎是问题,因为如果每个子查询都没有消息INTERNAL或EXTERNAL,则x.deviceHostName不可用。 – Marcello 2011-03-15 14:18:48