Mysql 可以检查组中是否有数字

Mysql 可以检查组中是否有数字,mysql,group-concat,Mysql,Group Concat,我只想得到那些有两行的id,一行有站点id=1,另一行有站点id=2 我两次尝试加入表,但查询时间太长。因此,我现在要做的是连接站点ID,并将行限制为只有1在这个concat值中,28在其中的行。然而,我不能让它工作。这与site_id是一个数字和我的concat值有关,即sites是一个字符串?如何确保这两个值都在连接的字符串中 SELECT *, COUNT(id) as num_ids FROM ( SELECT id, CONVERT(GROUP_CONCAT(`site_id`

我只想得到那些有两行的id,一行有
站点id=1
,另一行有
站点id=2

我两次尝试加入表,但查询时间太长。因此,我现在要做的是连接站点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

通过在
HAVING
子句中测试当
WHERE
子句已经过滤到(1,28)中的
site\u id时
计数(不同站点id)=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
更新:

要验证只有
站点\u id=28
添加了
日期\u bl>='2013-02-27'
,您需要一个稍微聪明一点的子查询:

WHERE
  site_id = 1
  OR (site_id = 28 AND date_added_lb >= '2013-02-27')
没有什么需要改变的


如果性能似乎不符合您的需要,请验证
站点id
上是否有索引,以及
id
上是否有索引。如果可能的话,它可能受益于
(id,site\u id)

上的复合索引。这可能会起作用,我试图避免使用have-though,因为它会明显减慢查询速度。另一件事是,我需要能够检查站点28的行的日期是否为“>=2013-02-27”`这太棒了。非常感谢。非常聪明的where子句。迈克尔·伯克夫斯基,这太棒了。几天来我一直在尝试不同的解决方案,这个很有效。@KevinDamstra很高兴你发现它很有用。