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 术语中的“派生表”),但此查询将返回与原始查询等效的结果集,而不会在 exp_channel_titles 表中引入或消除任何“重复”标题。

请注意,由于 JOIN 处理一对多关系的方式的性质,其他解决方案可能会引入重复。您可以避免返回使用 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 回答