私は少し質問があります、それはこのようになります:
見た目よりも少し複雑です。唯一の問題は、あるサブクエリの出力をIN句のパラメータとして使用して別のサブクエリを生成することです。ある程度は機能しますが、「IN」句の最初のIDからの結果のみを提供します。奇妙なことに、レコードID「00003,00004,00005」を手動で挿入すると、適切な結果が得られます。
私が目指しているのは、第2レベルの多対多の関係を取得することです。基本的に、tour_stopsにはアイテムがあり、そのアイテムには画像があります。すべてのアイテムからすべての画像を「item_images」としてJSON文字列に入れようとしています。述べたように、それは速く実行されますが、最初の関連アイテムからの画像のみを返します。
SELECT DISTINCT
tour_stops.record_id,
(SELECT
GROUP_CONCAT( item.record_id ) AS in_item_ids
FROM tour_stop_item
LEFT OUTER JOIN item
ON item.record_id = tour_stop_item.item_id
WHERE tour_stop_item.tour_stops_id = tour_stops.record_id
GROUP BY tour_stops.record_id
) AS rel_items,
(SELECT
CONCAT('[ ',
GROUP_CONCAT(
CONCAT('{ \"record_id\" : \"',record_id,'\",
\"photo_credit\" : \"',photo_credit,'\" }')
)
,' ]')
FROM images
WHERE
images.attached_to IN(rel_items) AND
images.attached_table = 'item'
ORDER BY img_order ASC) AS item_images
FROM tour_stops
WHERE
tour_stops.attached_to_tour = $record_id
ORDER BY tour_stops.stop_order ASC
以下の両方の答えを試しましたが、役に立ちませんでした。2番目の例(最初のサブクエリ全体を「IN」ステートメント内に配置)は、私がすでに得ているのと同じ結果を生成しただけでなく、クエリ時間を指数関数的に増加させました。
編集:INステートメントを次のように置き換えました
IN(SELECT item_id FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id)
そしてそれは動作しますが、今は残酷に遅くなっています。すべてが正しく索引付けされていると仮定すると、これが最善の方法ですか?
PHPMYADMINでgroup_concatを使用すると、結果が[BLOB-3B]として表示されます。
任意の洞察をいただければ幸いです。ありがとう