2013-08-27 61 views
0

我有一個小問題,以下查詢。它返回多個值。重複值與group_concat和連接

這是我收到的結果:

+----+--------------+--------+--------+---------------------+----------+------------------+ 
| id | company  | county | vm  | os     | products | sn    | 
+----+--------------+--------+--------+---------------------+----------+------------------+ 
| 1 | ABC Corp  | USA | VMW | Linux, Linux, Linux | 3  | A123, B234, A343 | 
| 2 | DEF Corp  | USA | CIT | Windows    | 1  | I223    | 
+----+--------------+--------+--------+---------------------+----------+------------------+ 

正如你可以看到,第一行顯示3倍的Linux,但這應該只列出一次。我已經看到,如果客戶擁有超過1種產品,則只會出現此問題。我想我必須將我的查詢或類似的東西分組,但我不知道如何。

這裏是我的查詢:

SELECT 
    customer.id, 
    customer.company, 
    countries.en AS country, 
    vmenv.name AS vm, 
    GROUP_CONCAT(operatingsystems.name SEPARATOR ', ') AS os, 
    COUNT(device2customer.sn) AS products, 
    GROUP_CONCAT(device2customer.sn SEPARATOR ', ') AS sn 
FROM 
    customer 

LEFT JOIN 
    countries 
ON 
    customer.country = countries.id 

LEFT JOIN 
    vmenv2kunden 
ON 
    vmenv2kunden.customerid = customer.id 

LEFT JOIN 
    vmenv 
ON 
    vmenv2kunden.vmenvnr = vmenv.id 

LEFT JOIN 
    operatingsystems2customer 
ON 
    operatingsystems2customer.customerid = customer.id 

LEFT JOIN 
    operatingsystems 
ON 
    operatingsystems2customer.osnr = operatingsystems.id 

LEFT JOIN 
    device2customer 
ON 
    device2customer.kundenid = customer.id 

GROUP BY 
    customer.id 
+0

DISTINCT也許工作? – Strawberry

回答

2

在查詢更改GROUP_CONCAT聲明

GROUP_CONCAT(DISTINCT operatingsystems.name SEPARATOR ', ') AS os, 
COUNT(DISTINCT device2customer.sn) AS products, 
GROUP_CONCAT(DISTINCT device2customer.sn SEPARATOR ', ') AS sn 

通過添加DISTINCT關鍵字就應該爲你

+0

好的,在這種情況下,我必須爲COUNT device2customer和GROUP_CONCAT device2customer使用DISTINCT。這是多次使用它的正確方法,還是我可以以另一種更好的方式做到這一點? – emjay

+0

是的,您必須在每個「GROUP_CONCAT」和「COUNT」中編寫「DISTINCT」,因爲您只是格式化輸出並且不想更改結果的其餘部分。如果你在'SELECT'關鍵字後面寫'DISTINCT',那麼你只會得到獨特的行,這裏不夠好,因爲它會查看整行,而不在'os'字段中查找重複項。 – Ohlin

+0

我更新了這個例子...... – Ohlin

1

只需喲Group_concat使用distinct

請嘗試更新下面的查詢。

SELECT 
    customer.id, 
    customer.company, 
    countries.en AS country, 
    vmenv.name AS vm, 
    GROUP_CONCAT(distinct operatingsystems.name SEPARATOR ', ') AS os, 
    COUNT(device2customer.sn) AS products, 
    GROUP_CONCAT(device2customer.sn SEPARATOR ', ') AS sn 
FROM 
    customer 

LEFT JOIN 
    countries 
ON 
    customer.country = countries.id 

LEFT JOIN 
    vmenv2kunden 
ON 
    vmenv2kunden.customerid = customer.id 

LEFT JOIN 
    vmenv 
ON 
    vmenv2kunden.vmenvnr = vmenv.id 

LEFT JOIN 
    operatingsystems2customer 
ON 
    operatingsystems2customer.customerid = customer.id 

LEFT JOIN 
    operatingsystems 
ON 
    operatingsystems2customer.osnr = operatingsystems.id 

LEFT JOIN 
    device2customer 
ON 
    device2customer.kundenid = customer.id 

GROUP BY 
    customer.id 
+0

好的,在這種情況下,我還必須爲COUNT device2customer和GROUP_CONCAT device2customer使用DISTINCT。這是多次使用它的正確方法,還是我可以以另一種更好的方式做到這一點? – emjay