2013-03-04 44 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

相关问题