0

私は少し質問があります、それはこのようになります:

見た目よりも少し複雑です。唯一の問題は、あるサブクエリの出力を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]として表示されます。

INサブクエリのGROUP_CONCAT

任意の洞察をいただければ幸いです。ありがとう

4

1 に答える 1

1

rel_itemsサブクエリで使用できることに驚いています。

あなたは試すかもしれません:

 concat(',', images.attached_to, ',') like concat('%,', rel_items, ',%') and

これは速い場合とそうでない場合があります。おそらく一致するものがないため、元のバージョンは高速でした。

inまたは、句を変更してみることもできます。時々、これらは不十分に最適化されます:

exists (select 1
        from tour_stop_item
        where tour_stops_id = tour_stops.record_id and images.attached_to = item_id
       )

そして、にインデックスがあることを確認してくださいtour_stop_item(tour_stops_id, item_id)

于 2013-03-19T21:56:49.590 に答える