2014-07-21 2 views
0

BY ORDER 나는 다음과 같은 테이블이있는 데이터베이스가MySQL의 GROUP BY 및 중복 제거

나는 각 점포에 대해 하나의 기록을 반환 할
NULL - Not visited 
0 - Visit pending 
1 - Visited 
2 - Skipped 

(상점마다 여러 번 방문 할 수도 있음). 그러나, 나는 반환 할 경우에만 가장 낮은 visitStatus 번호 :

+---------+--------------------------------------+------------+------------+ 
| storeID |    storeCity    | visitStatus| tripDate | 
+---------+--------------------------------------+------------+------------+ 
|  634 | BLACKBURN       |   1 | 05/17/2014 | 
|  634 | BLACKBURN       |   0 | 07/30/2014 | 
|  634 | BLACKBURN       |   2 | 07/30/2014 | 
|  636 | WARRINGTON       |  NULL | 07/30/2014 | 
+---------+--------------------------------------+------------+------------+ 

하지만 그것은 반환해야합니다 :

NULL, 0, 1 또는 2

예를 들어, 내 현재의 쿼리가이 반환

+---------+--------------------------------------+------------+------------+ 
| storeID |    storeCity    | visitStatus| tripDate | 
+---------+--------------------------------------+------------+------------+ 
|  634 | BLACKBURN       |   0 | 07/30/2014 | 
|  636 | WARRINGTON       |  NULL | 07/30/2014 | 
+---------+--------------------------------------+------------+------------+ 

GROUP BY와 ORDER BY의 다양한 조합을 시도했지만 해결할 수 없습니다. 어떤 도움이 많이

내 현재 쿼리

SELECT 
    stores.id AS storeID, 
    stores.city AS storeCity, 
    trips_stores.status AS visitStatus, 
    trips.trip_date AS tripDate 
FROM stores LEFT JOIN trips_stores on stores.id = trips_stores.store_id 
LEFT JOIN trips ON trips_stores.trip_id = trips.id 
WHERE stores.map_display = 1 
ORDER BY storeID ASC 

답변

1

감사이 또는 더 복잡한 쿼리에 대한 group by이 필요합니다. NULL 값을 처리

SELECT s.id AS storeID, s.city AS storeCity, 
     (case when sum(ts.status is null) > 0 then NULL 
      else min(ts.status) 
     end) AS visitStatus, 
     substring_index(group_concat(t.trip_date order by coalesce(ts.status, -1)), ',', 1 
        ) AS tripDate 
FROM stores s LEFT JOIN 
    trips_stores ts 
    on s.id = ts.store_id LEFT JOIN 
    trips t 
    ON ts.trip_id = t.id 
WHERE s.map_display = 1 
GROUP BY storeid, storecity 
ORDER BY storeID ASC; 

제대로 논리의 비트가 필요 : group by을 사용하면 substring_index()/group_concat() 트릭을 사용할 수 있습니다. NULL은 다른 값이있는 경우에도 가장 작은 값이므로 min()에서 명시 적으로 확인해야합니다.

+0

답장을 보내 주셔서 감사 합니다만 알 수없는 열 'visitStatus'이 (가) 필드 목록에 표시됩니다. – ginsberg

+0

@ginsberg. . . 이봐. * 나는 쿼리를 작성할 때 의미하는 바를 알고 있었지만 정확하지 않았습니다. 올바른 논리로 수정했습니다. –