2013-03-04 2 views
1

2 행과 1 행의 숫자가 site_id = 1 인 경우에만 인 ID를 가져 오려고합니다.숫자가 GROUP_CONCAT에 있는지 확인 가능

두 번 테이블에 가입하려고했지만 쿼리가 너무 오래 걸렸습니다. 그래서 지금 내가하고있는 일은 사이트 ID를 연결하고 1이이 concat 값에있는 행만 제한하고 28 개가이 값으로 제한됩니다. 그러나, 나는 그것을 작동시킬 수 없습니다. site_id가 숫자이고 concat 값이 sites 인 문자열과 관련이 있습니까? 이 두 값이 연결된 문자열에 있는지 어떻게 확인할 수 있습니까? WHERE 절이 이미 site_id IN (1,28)까지 필터링 한 경우 COUNT(DISTINCT site_id) = 2, 당신은 부질없이 확인할 수있는 HAVING 절에 테스트하여

SELECT *, COUNT(id) as num_ids 
FROM (
    SELECT id, CONVERT(GROUP_CONCAT(`site_id`) USING utf8) as `sites`, MAX(`Date_Added`) as `date_added_lb` 
    FROM `product_location` pl 
    WHERE `site_id` =1 OR `site_id` = 28 
    GROUP BY id 
) as t 
WHERE t.`date_added_lb` >="2013-02-27" 
AND 1 IN(`sites`) 
AND 28 IN(`sites`) 
AND num_ids=2 

답변

2

.

SELECT 
    id 
FROM production_location 
WHERE 
    date_added_lb >= '2013-02-27' 
    /* Filters for only site_id 1, 28 */ 
    AND site_id IN (1, 28) 
GROUP BY id 
/* And verifies that the group has exactly 2 different results (one of each 1, 28) */ 
HAVING COUNT(DISTINCT site_id) = 2 

업데이트 : 다른

WHERE 
    site_id = 1 
    OR (site_id = 28 AND date_added_lb >= '2013-02-27') 

아무것도 변경할 필요가 없다 :

site_id = 28date_added_bl >= '2013-02-27' 가지고, 당신은 약간 똑똑한 하위 쿼리를 필요로 확인합니다.

성능이 만족스럽지 않으면 site_id에 색인이 있고 id에 색인이 있는지 확인하십시오. 가능하면 (id, site_id)의 복합 색인을 사용하는 것이 좋습니다.

+0

이것은 작동 할 수 있습니다. 그러나 쿼리를 느리게 실행시킬 수 있기 때문에 사용하는 것을 피하려고했습니다. 또 다른 것은 사이트 28의 행에 날짜가 있음을 확인할 수 있어야한다는 것입니다.>> = 2013-02-27 ' – Nicola

+0

@Nicola Ok - 새 WHERE 절로 업데이트되었습니다. –

+0

그것은 훌륭합니다. 고맙습니다. 거기에서 where 절을 사용하면 매우 영리합니다. – Nicola

관련 문제