次の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
それを行う方法はありますか?これは他のテーブルを使用できません。
次の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
それを行う方法はありますか?これは他のテーブルを使用できません。
このクエリは、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
クラスターに対してクエリを実行していない限り、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 化されたテーブル オプションでこのオプションをベンチマークします。
@Michaelの回答では、気になるIDを持つテーブルがある場合は、Michaelのインラインデータの代わりに「ID」として使用できます。
これを試して
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
このフィドルを確認してください... 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も確認して ください
行である必要がありますか、それともデータをピボットして、すべての 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