1

だから私はSQLが得意ではありません.私は複雑なMySQLクエリを持っています.私が理解していない部分は、UNIONの上の部分的なクエリから得られるすべての結果が8倍になるということです.どのようにこれは可能ですか?なぜ彼らは8倍になっているのですか?どうすればそれを止めることができますか? これと非常によく似た他のクエリもいくつかありますが、それらはすべて同じ問題を抱えています。なぜこれが起こっているのかについてのアイデアは大歓迎です。ありがとうございました!

SELECT best_thrown
    FROM(
        SELECT CASE WHEN rageup_echelon.party_id IS NULL THEN 0 ELSE SUM(CASE WHEN rageup_echelon.echelon_vote = 1 THEN 5 ELSE 0 END) - SUM(CASE WHEN rageup_echelon.echelon_vote = 0 THEN 3 ELSE 0 END) END AS best_thrown
        FROM rageup_parties LEFT JOIN rageup_echelon ON rageup_parties.party_id = rageup_echelon.party_id
                            LEFT JOIN rageup_team_hosts ON rageup_parties.party_team_id = rageup_team_hosts.team_id
        WHERE rageup_team_hosts.team_id = 1 || rageup_team_hosts.team_id = 2 || rageup_team_hosts.team_id = 3
        AND rageup_parties.party_status = 'approved'
        AND rageup_parties.party_invites = 'public'
        AND rageup_team_hosts.user_id = 1
        GROUP BY rageup_parties.party_id
        UNION
        SELECT CASE WHEN rageup_echelon.party_id IS NULL THEN 0 ELSE SUM(CASE WHEN rageup_echelon.echelon_vote = 1 THEN 5 ELSE 0 END) - SUM(CASE WHEN rageup_echelon.echelon_vote = 0 THEN 3 ELSE 0 END) END AS best_thrown
        FROM rageup_parties LEFT JOIN rageup_echelon
        ON rageup_parties.party_id = rageup_echelon.party_id
        WHERE rageup_parties.party_host_id = 1
        AND rageup_parties.party_status = 'approved'
        AND rageup_parties.party_invites = 'public'
        AND rageup_parties.party_team_id = 'user'
        GROUP BY rageup_parties.party_id
        ORDER BY best_thrown DESC
        LIMIT 1
    ) AS T
4

1 に答える 1

2

デバッグの場合は、最初のクエリのみを実行し、GROUP BY返された基になる行を確認します。

LEFT JOIN from rageup_partiesまた、使用していることに注意してくださいrageup_team_hosts-一致するteam_hostsエントリをオプションにします-しかし、句team_idで非NULL値に設定する必要があります。WHEREを必要とするほどデータが汚れていることがわかっている場合はLEFT JOIN、それらの条件ONを各 の句に移動しますLEFT JOIN

于 2012-09-06T01:00:27.537 に答える