1

ユーザーが 2 つの異なるテーブルに送信したエントリの数でランク付けしようとしています。

テーブル gvr:

rid | jid 
---------------
1     54
2     54
3     54
4     75
5     75

テーブルは次のとおりです。

sid | jid
---------------
1     54
2     54
3     75
4     75
5     23
6     23

望ましい結果:

jid | overall_cnt | gvr_cnt | gos_cnt
----------------------------------
54    5            3          2
75    4            2          2
23    2            0          2

私は持っている:

(SELECT jid, count(*) gvr_count
FROM gvr 
WHERE jid IS NOT NULL
GROUP BY jid)
UNION ALL 
(SELECT jid, count(*) gos_count
FROM gos
WHERE jid IS NOT NULL
GROUP BY jid)

しかし、これはひどく間違っています。私は自分の状況に似た他の投稿を探していましたが、あまり価値のあるものはまだ見つかりませんでした. データ操作を PHP にオフロードすることを考えていますが、1 つのクエリで実行できると便利です。

4

4 に答える 4

2

ゴードンの回答を更新しました。これが最善のアプローチです。

 select jid ,sum(gvr_count)+ sum(gos_count) as OverallCount ,
  sum(gvr_count) as gvr_count, sum(gos_count) as gos_count
   from ((SELECT jid, count(*) gvr_count, 0 as gos_count
   FROM gvr 
   WHERE jid IS NOT NULL
   GROUP BY jid
  )
  UNION ALL 
  (SELECT jid, 0 as gvr_count, count(*) gos_count
   FROM gos
   WHERE jid IS NOT NULL
   GROUP BY jid
  )
 ) t
group by jid
于 2013-03-02T22:01:17.950 に答える
2

あなたのクエリはかなり近いです。union allしてから、次のことを行いますgroup by

select jid, sum(gvr_count) + sum(gos_count) as Overall_Count,
        sum(gvr_count) as gvr_count, sum(gos_count) as gos_count
from ((SELECT jid, count(*) gvr_count, 0 as gos_count
       FROM gvr 
       WHERE jid IS NOT NULL
       GROUP BY jid
      )
      UNION ALL 
      (SELECT jid, 0 as gvr_count, count(*) gos_count
       FROM gos
       WHERE jid IS NOT NULL
       GROUP BY jid
      )
     ) t
group by jid

これは、1 つのテーブルにのみ存在するものであっても、すべての「jid」を確実に取得するための MySQL での最良のアプローチだと思います。

于 2013-03-02T21:52:09.667 に答える
1
SELECT temp.jid,gvr_cnt + gos_cnt as totals,temp.*
FROM
(
SELECT gos1.jid
,(SELECT COUNT(*) from gvr where gvr.jid = gvr1.jid) AS gvr_cnt
,(SELECT COUNT(*) from gos where gos.jid = gos1.jid) AS gos_cnt
FROM gos gos1 left join gvr gvr1 on gos1.jid = gvr1.jid
group by gos1.jid
  ) as temp
group by temp.jid

SQL フィドルのデモ

于 2013-03-02T21:47:21.317 に答える
0

これは完全に正しいとは限りませんが、ここから取得できることを願っています。

SELECT innerQuery_1.jid AS jid, 
       (innerQuery_1.gvr_count + innerQuery_2.gos_count) AS overall_cnt, 
       innerQuery_1.gvr_count AS gvr_count,
       innerQuery_2.gos_count AS gos_count
FROM   (SELECT jid, count(*) gvr_count
        FROM   gvr 
        WHERE  jid IS NOT NULL
        GROUP BY jid) AS innerQuery_1,
       (SELECT jid, count(*) gos_count
        FROM   gos
        WHERE jid IS NOT NULL
        GROUP BY jid) AS innerQuery_2
GROUP BY innerQuery_1.jid
于 2013-03-02T21:46:00.583 に答える