2013-03-04 83 views
1

我只想得到那些有2行的ID,一行有site_id = 1,另一個。可能檢查一個數字是否在一個GROUP_CONCAT

我試過兩次加入表,但查詢時間太長。因此,我現在要做的是連接站點標識,並將行限制爲只有1處於此連接值中的行,並且其中包含28。但是,我無法讓它工作。這是做與site_id是一個數字和我的concat值,即sites是一個字符串?我如何確保這兩個值都在我的連接字符串中?

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

通過HAVING條款的COUNT(DISTINCT site_id) = 2WHERE條款已經滲透到site_id IN (1,28),你可以驗證它沒有子查詢測試。

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 

更新:

要驗證只有site_id = 28date_added_bl >= '2013-02-27',你需要一個稍微聰明的子查詢:

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

沒有別的需要改變。

如果性能看起來不符合您的需求,請驗證site_id上有一個索引,id上有一個索引。如果可能的話,它可能受益於(id, site_id)上的綜合指數。

+0

這可以工作,我試圖避免使用雖然因爲它可以顯着減緩查詢。 另一件事是,我需要能夠檢查網站28的行的日期是'> = 2013-02-27'' – Nicola 2013-03-04 13:59:44

+0

@Nicola Ok - 用新的WHERE子句更新。 – 2013-03-04 14:04:46

+0

太棒了。謝謝。非常聰明的那裏的where子句。 – Nicola 2013-03-04 14:10:44

相關問題