2012-07-02 76 views
0

这一直困扰我一段时间,作为一个新手我不知道我应该精确查找。经过几个小时的Google搜索后,我无法找到令人满意的答案。在另一个子查询中使用子查询结果WHERE IN(优化)

我有我已剥离和简化成为一个相对复杂的查询:

SELECT field_a1, 
     field_a2, 
     (SELECT Count(*) 
     FROM table_b 
     WHERE field_b1 IN (SELECT field_x1 
          FROM table_x) AND field_b2 = 1) AS new_field_1, 
     (SELECT Count(*) 
     FROM table_c 
     WHERE field_c1 IN (SELECT field_x1 
          FROM table_x) AND field_c2 = 2) AS new_field_2, 
     (SELECT Count(*) 
     FROM table_d 
     WHERE field_d1 IN (SELECT field_x1 
          FROM table_x) AND field_d2 = 3) AS new_field_3 
FROM table_a 
WHERE field_a1 IN (SELECT field_x1 
        FROM table_x) 

在原始查询,我有一个约30的那些new_field_*的。一切似乎工作正常,我得到了一些非常令人满意的结果(最终结果和性能)。

我的问题是,这个查询:

SELECT field_x1 
FROM table_x 

重复一个相当大量的时间(30 *返回的行数),一般用来为一组,其中WHERE IN将寻找匹配。

我的问题:

是否有可能只执行一次这个小的查询,并保持该结果,并多次使用它?

只有两个(可笑)的事情我能想到的是这样的事情(虚构的解决方案):

temp = (SELECT field_x1 
     FROM table_x) 
SELECT field_1 
FROM table_1 
WHERE field_1 IN temp 

或者在客户端上一次执行这个查询(一个网络服务器上运行PHP),那么附加的结果使用这样的事情今后查询:

$IN_Condition = implode(',', $stmt->execute()->fetchAll(PDO::FETCH_NUM)); 
$sql_query = "SELECT field_1 
       FROM table_1 
       WHERE field_1 IN ($IN_Condition)" 
+0

检查此链接。我希望你会有一些想法解决。 http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm –

+0

@ V.P.Verma,谢谢。我已经考虑过临时表,但是我仍然必须在每个子查询中“选择”它们。我不认为这就是我要找的。 – Adi

回答

1

尝试使用JOIN子句,例如 -

编辑:

SELECT 
    field_a1, 
    COUNT(b.field_b1) new_field_1, 
    COUNT(c.field_c1) new_field_2, 
    COUNT(d.field_d1) new_field_3 
FROM 
    table_a a 
JOIN table_x x 
    ON x.field_x1 = a.field_a1 
LEFT JOIN table_b b 
    ON b.field_b1 = x.field_x1 
LEFT JOIN table_c c 
    ON c.field_c1 = x.field_x1 
LEFT JOIN table_d d 
    ON d.field_d1 = x.field_x1 
GROUP BY 
    a.field_a1 
+0

对不起,我没有在我的问题中详细阐述这一点。提取'new_field_ *'经历的条件比'WHERE IN'更多。但是这个想法+1。 – Adi

+0

添加DISTINCT函数 - COUNT(DISTINCT b.field_b1)... – Devart

+0

我相信由于我的问题的复杂性,我无法完全解释它。感谢您的尝试。 – Adi

1

有时候,你并不需要做的查询优化,当发动机看到它获取的数据只有一次类似的子查询。不过你可以试试这个查询,看看它是否是速度快:

SELECT a.field_a1, a.field_a2, 
    (SELECT Count(*) 
    FROM x 
    WHERE x.field_x1 = b.field_b1 
     AND b.field_b2 = 1) AS new_field_1, 
    ... 
FROM table_a, table_b b, ..., -- Query here the tables you need 
    (SELECT field_x1 
     FROM table_x) x 
WHERE field_a1 IN x 

您也可以在内存中保持你的表,并与你的PHP引擎比较数据,但它会比与数据库引擎的工作速度较慢。

编辑:每当你需要表将被查询一次

编辑2:反向逻辑!

+0

这对我来说是直观的假设(引擎只会获取一次数据),但经过一些广泛的测试和分析后,我发现它实际上是多次查询表(30 *行数)次。 – Adi

+0

但这里的'x'是一个临时表,它不能在'WHERE IN'子句中使用。 – Adi

相关问题