5

次のmysqlクエリがあります:

SELECT id, sum(views) as total_views
FROM table
WHERE id IN (1,2,3)
GROUP BY id
ORDER BY total_views ASC

id 1,3データベースで見つかった場合のみ、0に設定してid 2表示したい.total_views

それを行う方法はありますか?これは他のテーブルを使用できません。

4

6 に答える 6

7

このクエリは、union で構成されるサブクエリを使用して、可能な ID のリストをハードコードします。次に、この ID のセットを、カウントする情報を含むテーブルに結合します。

これにより、出現がない場合でも、結果に ID が保持されます。

SELECT ids.id, sum(views) as total_views
FROM (
    SELECT 1 AS ID 
    UNION ALL SELECT 2 AS ID 
    UNION ALL SELECT 3 AS ID 
) ids 
LEFT JOIN table
    ON table.ID = ids.ID
GROUP BY ids.id
ORDER BY total_views ASC

または、数値テーブルがある場合は、次のクエリを実行できます。

SELECT numbers.number, sum(views) as total_views
FROM
    numbers
    LEFT JOIN table
        ON table.ID = ids.ID
WHERE numbers.number IN (1, 2, 3)
GROUP BY numbers.number
ORDER BY total_views ASC
于 2012-11-20T22:43:46.313 に答える
3

クラスターに対してクエリを実行していない限り、Micheal のソリューションの代替案を次に示します (悪いソリューションではありません。ID が「たくさん」ある場合でも)。

create temporary table __ids (
  id int unsigned primary key
) engine=MEMORY;

insert into __ids (id) values
  (1),
  (2),
  (3)
;

SELECT table.id, sum(views) as total_views
FROM __ids left join table using (id)
GROUP BY table.id
ORDER BY total_views ASC

また、クエリが複雑になった場合、この方法でより効率的に実行することも考えられます。しかし、もし私があなたなら、実際のデータを使用して、Michael のアドホック UNION 化されたテーブル オプションでこのオプションをベンチマークします。

于 2012-11-27T23:21:48.740 に答える
1

@Michaelの回答では、気になるIDを持つテーブルがある場合、Michaelのインラインデータの代わりに「ID」として使用できます。

于 2012-11-20T22:51:22.827 に答える
0

これを試して

    SELECT id 
                (CASE 1
                    IF EXISTS THEN  views = mytable.views END
                    IF NOT EXIST THEN views = 0 END
                CASE 2
                    IF EXISTS THEN  views = mytable.views END
                    IF NOT EXIST THEN views = 0 END
                CASE 3
                    IF EXISTS THEN  views = mytable.views END
                    IF NOT EXIST THEN views = 0 END), sum(views) as total_views
    FROM mytable
    WHERE id IN (1,2,3)
    GROUP BY id
    ORDER BY total_views ASC
于 2012-12-03T11:13:14.710 に答える
0

このフィドルを確認してください... http: //www.sqlfiddle.com/#!2 / a9392 / 3

Select B.ID, sum(A.views) sum from tableB B
 left outer join tableA A
 on B.ID = A.ID
group by A.ID

http://www.sqlfiddle.com/#!2/a1bb7/1も確認して ください

于 2012-11-20T23:05:43.333 に答える
0

行である必要がありますか、それともデータをピボットして、すべての ID に対して 1 行と 1 列を提供できますか?

SELECT
  SUM(IF (id=1, views, 0)) views_1,
  SUM(IF (id=2, views, 0)) views_2,
  SUM(IF (id=3, views, 0)) views_3
FROM table
于 2012-12-03T22:18:18.287 に答える