2016-11-08 9 views
1

enter image description here同じユーザーや複数のユーザーが挿入したMySQLで一意のデータを表示する方法はありますか?

私はこの方法で項目を合計したいのitem_id = 7777

でのレコードで、この表を考えてみましょう。

  • たとえば、最初の2つのレコードは1とみなされます(両方とも がguest_id = 1111によって挿入されます)。 id => 99の最後の値を取る。「下」の値が「上」の値より大きい。
  • 101から103までは、最後の1つ(103)、最終的にはup = 0、down = 12です(したがって、最後のレコードでは「1」だけインクリメントされます) "down"の値がupより大きい)
  • 最後の2つのレコードはユニークなguest_idであり、両方ともup => 1であるため、 "up"は2回インクリメントされます。

結果(count_up = 2、count_down = 2)

私は、クエリを書いたが、私はそれが最善かつ高速であるかどうかわからないです。

SELECT COUNT(DISTINCT IF(up > 0, USER, NULL)) AS voters_up, COUNT(DISTINCT IF(down > 0, USER, NULL)) AS voters_down 
FROM `items_votes` AS itemA 
LEFT JOIN (
    SELECT IF(guest_id IS NULL, user_id, guest_id) AS USER, MAX(id) AS id, item_id 
    FROM items_votes 
    WHERE item_id = 7777 
    GROUP BY guest_id,user_id) AS itemB ON itemA.id = itemB.id 
WHERE itemA.item_id = 7777 

これは上記のクエリで、私が期待しているとおりに返します。

enter image description here

しかし、このクエリは一つだけのアイテムの一意の合計を返します。 item_idの "where condition"を削除しても、クエリは機能しません。

どのようにitem_idをすべて同じにするか?

すべての商品のユニークな上記の返品のお問い合わせにお手伝いください。

+0

あなたのクエリが合理的です。 –

+0

ですが、item_id条件を削除すると、すべてのitems_idに対して1つのitem_idを実行します。それは動作しません。 – Shahid

答えて

1

クエリが機能する場合は、それを使用します。私は、このバージョンは単純だと思う:

SELECT SUM(up > down) as up_votes, 
     SUM(down > up) as down_votes 
FROM items_votes iv JOIN 
    (SELECT COALESCE(iv2.guest_id, iv2.user_id) as gu_id, MAX(id) as max_id 
     FROM items_votes iv2 
     WHERE iv2.item_id = 7777 
     GROUP BY COALESCE(iv2.guest_id, iv2.user_id) 
    ) iv2 
    ON iv.id = iv2.max_id; 

注:

  • これは(IDに基づく)最新のエントリを取得するには、ゲスト/ユーザーIDで集計します。
  • これは内側で元のデータに戻っています。
  • ゲスト/ユーザごとに1行が追加されました。したがって、count(distinct)は不要です。

EDIT:すべてのIDについて

:それは本当に動作するかどう

SELECT item_id, SUM(up > down) as up_votes, 
     SUM(down > up) as down_votes 
FROM items_votes iv JOIN 
    (SELECT item_id, COALESCE(iv2.guest_id, iv2.user_id) as gu_id, 
      MAX(id) as max_id 
     FROM items_votes iv2 
     WHERE iv2.item_id = 7777 
     GROUP BY item_id, COALESCE(iv2.guest_id, iv2.user_id) 
    ) iv2 
    ON iv.id = iv2.max_id 
GROUP BY item_id; 
+0

ありがとう、しかし、私は説明で書いたように、 "item_id = 7777"を使わないでやる方法。私はすべての項目について同じことをしたい。 – Shahid

関連する問題