2015-07-21 57 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'子查詢都需要一個單獨的變量。 –