2015-07-21 55 views
0

问题是如何找到内部查询返回的行的总数,但仍然使用由内部查询返回的集合(不重复相同的查询两次)。MySQL:计算子查询的结果并仍然使用它返回的集合

我有一个查询:

SELECT a1.name as name 
FROM 
(
    SELECT b1.id as id 
    FROM b1 JOIN b2 JOIN b3 ... 
    WHERE b1.x = ... AND ... 
) as ids 
JOIN a1 ON a1.id = ids.id 
JOIN a2 ON a2.id = ids.id AND ... 
JOIN a3 ON a3.id = ids.id AND ... 
WHERE a1.name = 'apple' AND a2.name = 'orange' AND a3.name = 'pear' 
UNION 
SELECT the same query but with 'cat', 'dog', 'mouse' 
UNION 
SELECT the same query but with 'python', 'perl', 'java' 
ORDER BY name 

与多个表和复杂的条件,其中该组ID的在子查询中被选择。

我想知道两个不同的东西:由大的查询,它使用一组特定的ID

  • 由内子查询选择ID的数量的选择

    • 值:很多标识是如何考虑,即使在外部查询中不匹配。

    表格很大,所以问题不在于如何找到信息,而是如何有效地做到这一点。假设执行内部查询两次,一次作为子查询,一次只用于计数,可能会太慢。

    我可以在一个查询中找到两种类型的信息吗?

    名称的ORDER是独立于ID,所以我想我不能GROUP BY a1.id因此不能使用COUNT DISTINCT a1.id.

  • +0

    你能不能''选择b1.id作为id,count(*)作为reccount ... where ... group by id'作为内部查询吗?然后,您应该能够根据需要使用来自内部查询的计数。 – zedfoxus

    +0

    @zedfoxus如果我正确地测试了它,当我使用'count(*)'时,内部查询只给出了一行。这是真的吗?听起来似乎是合理的,因为找到“count(*)”它需要工作直到找到最后一行。 –

    +0

    如果表中只有1个ID,则可能导致1行。否则,它应该给你唯一的ID和他们的计数。如果您熟悉sqlfiddle.com,我建议使用虚拟数据创建表格结构并编辑链接和预期结果。这将有助于回答问题 – zedfoxus

    回答

    1

    这太长了评论,它不回答你的问题(我真的不明白)。但是,为什么你使用union?只是对所有的条件单where条款:

    WHERE (a1.name = 'apple' AND a2.name = 'orange' AND a3.name = 'pear') or 
         (a1.name = 'cat' AND a2.name = 'dog' AND a3.name = 'mouse') or 
         (a1.name = 'python' AND a2.name = 'perl' AND a3.name = 'java') 
    

    如果您想通过内部查询选择的号码,下面应该工作:

    SELECT a1.name as name, @num as NumberSelected 
    FROM (SELECT b1.id as id, @num := @num + 1 
         FROM b1 JOIN b2 JOIN b3 ... CROSS JOIN (SELECT @num := 0) params 
         WHERE ... 
        ) ids 
    

    子查询应该在外部查询之前评估,所以@num的值应该是正确的。

    +0

    我使用UNION,因为否则JOIN会爆炸式增长,我想。至少测试表明,使用OR会慢几个数量级。我指出我必须使用UNION,因为那样我就不能使用@ num ++。或者,有没有办法在每个UNION之前以某种方式重置@num?那么这将是答案! –

    +0

    OOPS,可能会将您的@num除以UNION的数目会给出答案?现在会测试这个。 –

    +0

    @AlexanderGelbukh。 。 。每个'union'子查询都需要一个单独的变量。 –