可以检查数字是否在GROUP_CONCAT中

时间:2013-03-04 13:52:37

标签: mysql group-concat

我想只获取那些有2行,一行有site_id = 1,另一行有site_id = 2的ID。

我尝试两次加入表格,但查询花了太长时间。所以我现在正在做的是连接站点ID,并将行限制为只有1在此concat值中的行,并且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

1 个答案:

答案 0 :(得分: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)上的综合索引。