すべてのイベントのファイルの合計量を返す SQL を作成しようとしています。
DB:
id | name | filename1 | filename2
1 event1 1.jpg 2.jpg
2 event2 1.jpg Null
このシナリオを見ると、「You have 3 files」が返されるはずですが、SQL の作成方法がわかりません。
私はmySQLを使用しています。
ありがとう
およびフィールドのデータをピボット解除または使用して、合計数を取得できます。は複数の列からデータを取得し、それを複数の行に変換します。UNION ALL
filename1
filename2
UNION ALL
select count(files) Total
from
(
select name, filename1 as files
from yourtable
union all
select name, filename2
from yourtable
) src
デモで SQL Fiddle を参照してください
あなたのテーブルは正規化されておらず、これがあなたの人生を困難にしています。event:files のように 1 対多の関係がある場合、2 つのテーブルが必要です。1 つはイベント用で、もう 1 つはイベントに属するファイル用です。このような:
event_id int unsigned not null auto_increment
event_name varchar(45)
....
file_id int unsigned not null auto_increment
event_id int unsigned not null,
file_name varchar(45)
....
ファイルの総数を取得するには、次のようにします。
SELECT COUNT(*) FROM eventfiles;
イベントごとのファイル数を取得する場合は、次のようにします。
SELECT e.event_name, COUNT(f.file_id)
FROM events e LEFT JOIN eventfiles f ON e.event_id=f.event_id
GROUP BY e.event_name;
そこにファイル名がない場合、列の内容を指定しませんでした。その場合、NULLであると想定します(そうあるべきです)。
パフォーマンスについては不明ですが、その場合はこれでうまくいくはずです:
SELECT
SUM(CASE WHEN filename1 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN filename2 IS NOT NULL THEN 1 ELSE 0 END) img_cnt
FROM event_table;
イベント ID で個々のイベントの数を取得することもできます。
SELECT event_id
SUM(CASE WHEN filename1 IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN filename2 IS NOT NULL THEN 1 ELSE 0 END) img_cnt
FROM event_table
GROUP BY event_id
また、この DB 構造が良くないことも事実です。dnagirl が提案したように、正規化する必要があります。