1

我正在使用一个数据库,恕我直言,设计得不好,但也许只是我不理解它。无论如何,我有一个查询可以提取正确的信息,但它确实减慢了我的 php 脚本。我希望有人可以看看这个,让我知道嵌套查询到这个深度是否不好,以及是否有一种方法可以从下面的 sql 语句中描述的关系中简化查询。

SELECT name 
FROM groups 
WHERE id = (SELECT DISTINCT immediateparentid 
            FROM cachedgroupmembers 
            WHERE groupid = (SELECT  g.id AS AdminCc
                             FROM Tickets t, groups g  
                             WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc')
                             AND immediateparentid <> (SELECT  g.id AS AdminCc
                                                       FROM Tickets t, groups g  
                                                       WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'))

请帮忙

更新:

这是使用解释的输出 解释

您可能需要右键单击并选择“查看图像”以使文本清晰。

4

3 回答 3

1

据我所知,您可以消除一个子选择。

SELECT name 
FROM groups 
WHERE id = (
    SELECT DISTINCT immediateparentid 
    FROM cachedgroupmembers 
    WHERE groupid = (
        SELECT g.id 
        FROM Tickets t, groups g
        WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'
    ) AND immediateparentid != groupid
)
于 2013-01-03T15:54:13.043 回答
1

我更习惯于 Oracle 上的 PL/SQL,但我会试一试。

  1. 摆脱别名,这里不需要它们。
  2. where确保子句中使用的列被索引(t.Idg.type)。
  3. 不知道 MySQL 是否默认索引外键但值得一试。

您可以像这样缩短 SQL 代码:

SELECT name 
FROM groups 
WHERE id = (
    SELECT DISTINCT immediateparentid 
    FROM cachedgroupmembers 
    WHERE groupid = (
        SELECT g.id 
        FROM Tickets t, groups g
        WHERE t.Id = 124 AND t.id = g.instance AND g.type = 'AdminCc'
   ) AND immediateparentid != groupid
)

或者:

 SELECT name 
    FROM groups 
    WHERE id = (
        SELECT DISTINCT immediateparentid 
        FROM cachedgroupmembers 
        WHERE groupid = (
            SELECT g.id 
            FROM Tickets t inner join groups g on t.id = g.instance
            WHERE t.Id = 124 AND g.type = 'AdminCc'
 ) AND immediateparentid != groupid
)
于 2013-01-03T16:36:29.000 回答
0

如果您的票证表很大,您可以考虑使用临时表而不是查询两次

于 2013-01-03T15:48:56.303 回答