0

すべてのイベントのファイルの合計量を返す SQL を作成しようとしています。

DB:

id | name    | filename1 | filename2
1    event1    1.jpg       2.jpg
2    event2    1.jpg       Null

このシナリオを見ると、「You have 3 files」が返されるはずですが、SQL の作成方法がわかりません。

私はmySQLを使用しています。

ありがとう

4

3 に答える 3

5

およびフィールドのデータをピボット解除または使用して、合計数を取得できます。は複数の列からデータを取得し、それを複数の行に変換します。UNION ALLfilename1filename2UNION ALL

select count(files) Total
from
(
    select name, filename1 as files
    from yourtable
    union all
    select name, filename2
    from yourtable
) src

デモで SQL Fiddle を参照してください

于 2013-01-16T16:07:05.270 に答える
1

あなたのテーブルは正規化されておらず、これがあなたの人生を困難にしています。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;
于 2013-01-16T16:10:37.533 に答える
0

そこにファイル名がない場合、列の内容を指定しませんでした。その場合、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 が提案したように、正規化する必要があります。

于 2013-01-16T16:10:06.117 に答える