Mysql 可以检查组中是否有数字
我只想得到那些有两行的id,一行有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=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很高兴你发现它很有用。