爲了最終確定我今天的MySQL問題,我想就此問題提出一些建議。我有一張表,我需要添加一個計算值的列。我不想更新表格 - 只是結合信息。 我正在使用的表看起來像這樣:在MySQL中循環返回錯誤值時的情況
+----------------+----------------+--------------------------------------+
| VOTE_CANDIDATE | ORIGINAL_VOTES | SURPLUS_REDISTRIBUTION_TO_CANDIDATES |
+----------------+----------------+--------------------------------------+
| 1 | 8 | -1 |
| 2 | 1 | -1 |
| 3 | 2 | -1 |
| 4 | 4 | -1 |
| 5 | 2 | -1 |
| 6 | 3 | -1 |
+----------------+----------------+--------------------------------------+
我的問題是,只有第1行應返回-1列SURPLUS_REDISTRIBUTION_TO_CANDIDATES因爲它是ORIGINAL_VOTES大於7的閾值時,剩下的應該(如低於狀態的情況)由於低於閾值而返回零。看起來,查詢鎖定在第一行,然後在所有行上重新使用SURPLUS_REDISTRIBUTION_TO_CANDIDATES。這是我正在處理的查詢:
SELECT vote_candidate, COUNT(*) original_votes, CASE
WHEN (
(
SELECT MAX(
(
SELECT COUNT(*) votes_above_the_threshold
FROM vote_orders
)
) votes
FROM vote_orders
WHERE vote_order = 1
) >= (
SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold
FROM votes
)
)
THEN (
SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold
FROM votes
) - (
SELECT MAX(votes_above_the_threshold) votes
FROM (
SELECT vote_candidate vote_candidate, COUNT(*) votes_above_the_threshold
FROM vote_orders
WHERE vote_order = 1
GROUP BY vote_candidate
HAVING votes_above_the_threshold >= (
SELECT FLOOR((COUNT(*)/(2 + 1)) + 1) threshold
FROM votes
)
) t
WHERE votes_above_the_threshold = (
SELECT MAX(votes_above_the_threshold)
FROM vote_orders
)
)
ELSE 0
END surplus_redistribution_to_candidates
FROM vote_orders
WHERE vote_order = 1
GROUP BY vote_candidate;
如何獲得我要查找的結果?
很棒的回答。它不僅工作 - 你也爲我澄清事情。我必須承認 - 這個片段所屬的整個查詢更加令人困惑。這個解決方案雖然對此有所闡述。 :) 非常感謝你!向上投票並標記爲答案。 –
如果整個查詢與此片段一樣令人困惑,則可能需要重新考慮整個查詢的方法,特別是如果您的查詢包含子查詢,尤其是如果它多次重複相同的子查詢。我懷疑有一個更簡單(更容易理解)的方法來解決這個問題。 – spencer7593