2014-09-30 12 views
0

我正在研究運行速度非常慢的查詢,並試圖弄清楚如何將子查詢加載到數組中或使其更快。將子查詢結果設置爲數組,需要太長時間才能運行

SELECT COUNT(bdgid) 
FROM member_badges 
WHERE usid in(
    SELECT usid 
    FROM member_badges 
    WHERE bdgid in (1,4,5,6,7,8) 
    GROUP BY usid 
    HAVING COUNT(usid) =6) 
GROUP BY bdgid 

子查詢retuns USID的的一組特定的列表,以及主查詢計算包含這些用戶ID之一bdgid的。但是這個例子運行時間太長。

mbrbdid usid  bdgid 
------------------------------ 
1   14  1 
2   11  4 
3   25  4 
4   11  7 
5   11  8 
6   22  1 

該表有30多萬條記錄。基本上每個人都可以獲得任何徽章1-10次。這個表格是每次用戶獲得徽章時的一個實例。 因此,我試圖讓所有有獎徽章(1,4,5,6,7,8)的USID,然後做每個徽章1-10的計數,但只使用這些特定ID的

+0

你試過'EXPLAIN SELECT COUNT(bdgid).....' – Milen 2014-09-30 20:37:50

+0

你確定你不想'COUNT(DISTINCT bdgid)'和'COUNT(DISTINCT USID)'?除非在兩種情況下都有實際寫入'COUNT(*)'的空值。 – Arth 2014-09-30 20:41:32

+0

準確地分解你想要的單詞,然後它會更容易幫助。這是一個令人難以置信的混淆查詢。 – Arth 2014-09-30 20:49:16

回答

2

您的子查詢是爲外部查詢中的每一行運行,您可以通過使用與子查詢結果的聯接作爲子選擇來重寫您的查詢。通過這種方式,子選擇將被評估一次,並且結果將與您的外部查詢進行連接。和bdgid將有助於

SELECT COUNT(bdgid) 
FROM member_badges a 
join (
    SELECT usid 
    FROM member_badges 
    WHERE bdgid in (1,4,5,6,7,8) 
    GROUP BY usid 
    HAVING COUNT(usid) =6) b 
on(a.usid = b.usid) 
GROUP BY bdgid 
+0

我有點理解你是什麼越來越,但這不斷返回一個空的結果集 – amazingacademy 2014-09-30 20:43:51

+0

@amazingacademy你可以提供你的表的一些示例數據集與表定義? – 2014-09-30 20:47:23

+0

添加樣本數據 – amazingacademy 2014-09-30 20:54:31

1

分割使用臨時表,並加入對臨時表的查詢......

create temporary table usid_temp SELECT usid 
FROM member_badges 
WHERE bdgid in (1,4,5,6,7,8) 
GROUP BY usid 
HAVING COUNT(usid) =6 

- 再加入

SELECT COUNT(bdgid) 
FROM member_badges a, usid_temp b 
where a.usid = b.usid group by bdgid 

其實我upvoted Khalids答案時,我張貼了這個,因爲他是一個更好的答案。

+0

我試過這個,但是一旦創建了表格,它就不會添加數據。我正在使用phpMyAdmin – amazingacademy 2014-09-30 20:54:57

+0

我嘗試過使用「創建表」 – amazingacademy 2014-09-30 21:03:16

+0

不要這樣做,它只是M Khalid查詢的錯誤副本..您不想在每次運行查詢時創建一個臨時表。讓MySQL通過連接爲你做。 – Arth 2014-09-30 21:04:56

0

在這種情況下,我會推薦EXISTS而不是IN

SELECT COUNT(bdgid) 
FROM member_badges A 
WHERE EXISTS (
    SELECT B.usid 
    FROM member_badges B 
    WHERE B.bdgid in (1,4,5,6,7,8) 
    and A.UsID=B.usID 
    GROUP BY B.usid 
    HAVING COUNT(B.usid) =6) 
GROUP BY bdgid 
相關問題