親切な SO ユーザーの助けを借りて、私が取り組んでいるタスクに対する論理的に正しい MySQL クエリを作成することができました。特定のタイプのグループ化されたアイテムを、そのグループの単一の代表にフィルタリングします。(ふぅ!)
残っている明らかな問題は、このクエリが非常に不格好で遅いことです。CakePHP のデータベース呼び出しのデバッグ出力によると、145000 ミリ秒の調整が必要です。
このような獣を飼いならすための賢明なアプローチはありますか、それとも、ここで噛むことができる以上に噛んでいることを認め、多かれ少なかれ同様の結果を達成する、それほど重くないアプローチを探す必要がありますか? すべての提案に感謝します。
SELECT DISTINCT Uid.id, Uid.type
FROM (SELECT uids.id id, uids_uids.parent_id parent_id, uids.created date,
uids.type type
FROM uids
JOIN uids_uids ON uids_uids.uid_id = uids.id
JOIN aros_uids ON uids.id = aros_uids.uid_id
JOIN uids_uids ParentUids ON uids_uids.parent_id = ParentUids.uid_id
WHERE uids.type IN ('Document','Photo','Release','PreRelease',
'ArtworkResource','Event')
AND (uids.start_date IS NULL OR uids.start_date <= NOW())
AND (uids.end_date IS NULL OR uids.end_date <= NOW())
AND aros_uids.aro_id IN (3,2,86,1448)
) Uid
JOIN (SELECT uids_uids.parent_id parent_id, MAX(uids.created) maxdate
FROM uids JOIN uids_uids
ON uids_uids.uid_id = uids.id
GROUP BY uids_uids.parent_id, uids.type) T2
ON Uid.parent_id = T2.parent_id AND Uid.date = T2.maxdate
ORDER BY Uid.date DESC
LIMIT 100
到着予定時刻:
さて、最初のパスとして、これらのサブセレクトをビューに変えたので、クエリはもう少し管理しやすいように見えます
SELECT DISTINCT Uid.id, Uid.type
FROM UidView Uid
JOIN UidView2 T2
ON Uid.parent_id = T2.parent_id AND Uid.date = T2.maxdate
WHERE Uid.aro_id IN (3,2,86,1448)
ORDER BY Uid.date DESC
LIMIT 100
これは間違いなく役に立ち、Cake の推定クエリ時間 (ミリ秒) が 6 桁から 2500 程度に短縮されました。間違いなく良いスタートです!