我想只获取那些有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
答案 0 :(得分:2)
通过在HAVING
子句中测试COUNT(DISTINCT site_id) = 2
当WHERE
子句已经过滤到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 = 28
有date_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)
上的综合索引。