1

我只想获取那些有 2 行且一行有 的 id,另一行site_id = 1site_id = 2.

我尝试加入该表两次,但查询时间过长。所以我现在要做的是连接站点 id,并将行限制为仅在此 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
4

1 回答 1

2

通过在 when子句已经过滤到的HAVING子句中进行测试,您可以在没有子查询的情况下对其进行验证。COUNT(DISTINCT site_id) = 2WHEREsite_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 = 28has date_added_bl >= '2013-02-27',您需要一个更智能的子查询:

WHERE
  site_id = 1
  OR (site_id = 28 AND date_added_lb >= '2013-02-27')

没有其他东西需要改变。

如果性能似乎无法满足您的需要,请验证是否有一个索引 onsite_id和一个 on id。如果可能,它可能会受益于(id, site_id).

于 2013-03-04T13:56:03.097 回答