7

非常に具体的で、必要なものを正確に返すこのクエリがあります。ご存じのように、mysql のネストされたクエリは、実行時間の点でかなりひどいものになる可能性があります。次のコードをステートメントに変換するのを手伝ってくれる人がいれば、JOIN本当に感謝しています。

もちろん、他の最適化は歓迎され、推奨されます。

SELECT title 
FROM   exp_channel_titles 
WHERE  entry_id IN (SELECT rel_child_id 
                    FROM   exp_relationships 
                    WHERE  rel_id IN (SELECT field_id_202 
                                      FROM   exp_channel_data 
                                      WHERE  entry_id = 19971));

ありがとうございました!

4

3 に答える 3

4
SELECT DISTINCT
  titles.title
FROM
  exp_channel_titles  AS titles
INNER JOIN
  exp_relationships   AS rel
    ON titles.entry_id = rel.rel_child_id
INNER JOIN
  exp_channel_data    AS channel
    ON rel.rel_id = channel.field_id_202
WHERE
  channel.entry_id = 19971

DISTINCTは、重複を作成する可能性のある多くの関係などがある場合に使用します。

最適化の観点から、各テーブルにJOINおよびWHERE句で使用するフィールドのインデックスがあることを確認してください。

于 2012-08-23T16:25:51.383 に答える
2

別の方法:

SELECT t.title 
  FROM exp_channel_titles t
  JOIN ( SELECT r.rel_child_id 
           FROM exp_relationships r
           JOIN exp_channel_data d
             ON d.field_id_202 = r.rel_id
          WHERE d.entry_id = 19971
          GROUP BY r.rel_child_id 
       ) c
    ON c.rel_child_id = t.entry_id

このクエリにはまだインライン ビュー (または MySQL 用語では「派生テーブル」) が含まれていますが、このクエリは元のクエリと同等の結果セットを返します。

JOIN が 1 対多の関係を処理する方法の性質上、他のソリューションでは重複が発生する可能性があることに注意してください。DISTINCT キーワードまたは GROUP BY 句を使用して導入された重複を返すことを回避できますが、これにより、元のクエリで返されていた重複も排除されます。

于 2012-08-23T16:43:55.023 に答える
1
select t.title
  from exp_channel_titles as t
  inner join exp_relationships as r
    on r.rel_child_id = t.entry_id
  inner join exp_channel_data as d
    on d.field_id_202 = r.rel_id
    and d.entry_id = 19971;
于 2012-08-23T16:28:05.633 に答える