2

m_techno_idea (アイデアを保存)、m_techno_idea_moderator_vote (モデレーターの投票)、m_techno_idea_user_vote (ユーザーの投票用) というテーブルがあります。モデレーターの投票が 1 から 5 の間であるのに対し、ユーザーの投票は 1 のみであり、votes という名前の列に保存されます。だから私は合計番号を取得する必要があります。1 回のクエリでの投票数。ネストされたクエリは必要ありません。

私の試み:

試行 1:

SELECT 
        COUNT(DISTINCT TIUV.PK_ID) + IFNULL((SUM(TIMV.VOTES)),0) AS VOTES
  FROM 
        M_TECHNO_IDEA TI 
 LEFT OUTER JOIN
        M_TECHNO_IDEA_MODERATOR_VOTE TIMV
   ON 
       TIMV.FK_TECHNO_IDEA_ID=TI.PK_ID
 LEFT OUTER JOIN
       M_TECHNO_IDEA_USER_VOTE TIUV
  ON
       TIUV.FK_TECHNO_IDEA_ID=TI.PK_ID
  WHERE 
       TI.PK_ID=2

ここで、distinct キーワードを使用すると、ユーザーの投票に対して個別の行を作成できますが、モデレーターの投票に対しては、投票が多くの行で同じになる可能性があるため、distinct を使用できません。これにより、間違った結果が得られます。

試行 2:

SELECT (select count(TIUV.PK_ID) FROM M_TECHNO_IDEA_USER_VOTE TIUV
WHERE TIUV.FK_TECHNO_IDEA_ID=2) +
(select sum(TIMV.VOTES) FROM M_TECHNO_IDEA_moderator_VOTE TIMV
WHERE TIMV.FK_TECHNO_IDEA_ID=2) AS VOTES

試行 2 では正しい結果が得られますが、クエリは見栄えがよくありません。group by も試しましたが、役に立ちませんでした。どんな助けでも大歓迎です。

試行 3:

SELECT 
    COUNT(DISTINCT TIUV.PK_ID) + IFNULL(MODVOTES.VOTES, 0) AS VOTES
FROM
    (SELECT 
        TIMV.FK_TECHNO_IDEA_ID, SUM(TIMV.VOTES) VOTES
    FROM
        M_TECHNO_IDEA_MODERATOR_VOTE TIMV
    GROUP BY TIMV.FK_TECHNO_IDEA_ID) MODVOTES
        LEFT OUTER JOIN
    M_TECHNO_IDEA_USER_VOTE TIUV ON TIUV.FK_TECHNO_IDEA_ID = MODVOTES.FK_TECHNO_IDEA_ID
WHERE
    TIUV.FK_TECHNO_IDEA_ID = 2

この試みも正しい結果をもたらします。ネストされたサブクエリを配置する必要がありました。より良い解決策があれば、それはありがたいです。

4

2 に答える 2

0

これを実現するには、「2 つの異なるテーブルに保存されている 2 つの投票の合計を取得したいだけです」という場合は、派生テーブルを使用します。これが一般的な考え方です。

select sum(votes) totalvotes
from (
select count(something) votes
from TheFirstTable
where whatever
union 
select count(something) votes
from TheSecondTable
where whatever ) ThisIsCalledADerivedTable

要件に合わせて派生テーブルをまとめることができます。

于 2013-10-14T13:12:02.847 に答える