2013-10-12 15 views
-1

這是mybb_reputation表返回行(S)如果一個列的總和達到一定的數量

mybb_reputation table

我想抓取行(S)的數量rid如果所有這些行,reputation總和例如在這種情況下(請參閱上圖),如果我運行一個查詢,它應該返回1,2和3(因此總聲望爲3),或者它只返回5,因爲它的聲譽是完全等於3

我試過運行這個查詢;

SELECT * FROM mybb_reputation WHERE SUM(reputation) = 3; 

但是由於在MySQL中的知識有限的示值誤差例如爲:#1111 - 無效使用組功能的

請幫幫忙!

+1

你的分組工作如何?大多數答案都假定您的意思是檢查共享公用字段值的一組行的信譽。例如,爲什麼你不想要第6和7行,他們加到3 – AgRizzo

+0

@ AgRizzo,如果聲譽的總和恰好等於3,那麼它是否返回1,2,3或者只有5或者是6,7 ,它應該沒問題。 – user2854563

+0

(只是我的意見,但..)我認爲這是不可能的,給你一個解決方案,將找到每個可能的組合。找到1行等於3很容易。發現2並不困難,但你用一個笛卡兒積結束,檢查總和等於3.檢查任何3條記錄要困難得多。你有3以上的限制嗎?記錄必須是連續的嗎? – AgRizzo

回答

0

試試這個

SELECT * FROM mybb_reputation GROUP BY rid HAVING SUM(reputation) = 3 ORDER BY RAND() LIMIT 1; 
+0

謝謝,這是有效的。但是,如果我使用4而不是3,那麼它只返回擺脫了7只有2的聲譽 – user2854563

+0

直到我找到一個正確的答案我接受這個,因爲它非常類似於我想要的。感謝所有回覆的人。 – user2854563

0
SELECT * 
FROM mybb_reputation 
GROUP BY uid 
HAVING SUM(reputation) >= 3 
ORDER BY RAND() 
LIMIT 1 

不確定這個的確切順序,但它應該包含所有你需要的條件。

說實話,你的數據結構似乎很奇怪,以回答這樣的疑問。

0

你可能想要得到一個組的總和。我會假設你想按UID:

SELECT * FROM mybb_reputation 
WHERE uid in 
    (Select uid FROM mybb_reputation 
    GROUP BY uid 
    HAVING SUM(reputation) = 3); 

如果要選擇符合某些聚合條件各行,你需要一個子查詢。嵌套子查詢查找具有所需條件的組。然後,外部查詢表示返回該組中的每一行。該組必須以某種方式被識別,在這種情況下,我們正在使用uid。

MySQL的某些實現會將此視爲相關的子查詢,如果您的表很大,這可能是個問題。使用連接,而不是一個子查詢

SELECT * FROM mybb_reputation 
WHERE uid in 
    (SELECT * FROM 
    (Select uid FROM mybb_reputation 
     GROUP BY uid 
     HAVING SUM(reputation) = 3)); 

或:如果你有問題,你可以添加子選擇一個更層進行修復

SELECT r1.* FROM mybb_reputation r1, 
    (Select uid FROM mybb_reputation 
     GROUP BY uid 
     HAVING SUM(reputation) = 3) r2 
WHERE r1.uid = r2.uid; 
+0

你知道這種關閉查詢會殺死大型表上的mysql(低於5.6版本)性能嗎?並最喜歡需要在外部查詢 –

+0

表mybb_reputation上的完整表掃描嗯,我知道我運行這個查詢就好了。但是,對於任何具有將實現將該查詢視爲關聯的舊實現的人來說,添加如何解決查詢不相關問題可能更加謹慎。 –

+0

事實上MySQL版本> 5.6的優化器更好..但JOIN(正確的索引,沒有「使用臨時;使用filesort」)將明顯勝過這個IN語句構造有很多記錄 –

1

這個答案跟我的意見 -

找到1條記錄(easy)

SELECT tmp1.rid AS rid 
FROM mybb_reputation AS tmp1 
WHERE tmp1.reputation = 3; 

找到任何2條(使用<因爲關係的順序是不相關的答案)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid) AS rid 
FROM mybb_reputation AS tmp1 
JOIN mybb_reputation AS tmp2 
    ON tmp1.rid < tmp2.rid 
WHERE tmp1.reputation + tmp2.reputation = 3 

找到任何3條記錄(相同的思路有關<前)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid, tmp3.rid) AS rid 
FROM mybb_reputation AS tmp1 
JOIN mybb_reputation AS tmp2 
    ON tmp1.rid < tmp2.rid 
JOIN mybb_reputation AS tmp3 
    ON tmp2.rid < tmp3.rid 
WHERE tmp1.reputation + tmp2.reputation + tmp3.reputation = 3 

查找4(算法只是重複)

SELECT CONCAT_WS(',',tmp1.rid, tmp2.rid, tmp3.rid, tmp4.rid) AS rid 
FROM mybb_reputation AS tmp1 
JOIN mybb_reputation AS tmp2 
    ON tmp1.rid < tmp2.rid 
JOIN mybb_reputation AS tmp3 
    ON tmp2.rid < tmp3.rid 
JOIN mybb_reputation AS tmp4 
    ON tmp3.rid < tmp4.rid 
WHERE tmp1.reputation + tmp2.reputation + tmp3.reputation + tmp4.reputation = 3 

無論您需要多少組合,您都需要繼續此操作。

相關問題