2013-08-27 1 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 번 보여 주지만,이 한 번만 나열되어야합니다 : 여기

내가 받고있어 결과입니다. 이 문제는 고객이 제품이 두 개 이상인 경우에만 발생하는 것으로 나타났습니다. 나는 내 쿼리 또는 이와 비슷한 것을 그룹화해야한다고 생각하지만 어떻게해야할지 모르겠다. 방금 요 Group_concatdistinct를 사용할 필요가

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 당신을 위해 일해야 DISTINCT 키워드를 추가

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

에 GROUP_CONCAT 문을 변경? – Strawberry

답변

2

은 아마도

+0

좋아요,이 경우 DISTNCT를 COUNT device2customer 및 GROUP_CONCAT device2customer에도 사용해야합니다. 여러 번 사용하는 것이 올바른 방법입니까, 아니면이 모든 것을 다른 방법으로 더 잘 할 수 있습니까? – emjay

+0

예, 출력을 포맷하고 나머지 결과는 변경하지 않기 때문에 모든 'GROUP_CONCAT'과'COUNT'에'DISTINCT'를 써야합니다. 'SELECT' 키워드 다음에'DISTINCT'를 쓰면 고유 라인을 얻게 될 것이고 전체 라인을 보게 될 것이고'os' 필드 내에서 중복을 찾지 않을 것이므로 여기서는 충분하지 않습니다. – Ohlin

+0

예를 업데이트했습니다 ... – Ohlin

1

:

여기 내 쿼리입니다.

아래 업데이트 된 검색어를 사용해보십시오. 귀하의 요청에

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