1

site_id = 12つの行があり、一方の行に、、もう一方の行があるIDのみを取得したいと思いsite_id = 2ます。

テーブルを2回結合しようとしましたが、クエリに時間がかかりすぎました。したがって、私が現在行っているのは、サイトIDを連結し、行をこの連結値に1が含まれ、28が含まれる行のみに制限することです。しかし、私はそれを動作させることができません。これは、site_idが数値であり、私の連結値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

句がすでににフィルターされている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 = 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)

于 2013-03-04T13:56:03.097 に答える