我正在尝试构建一个SQL,它将返回所有事件的文件总量。
DB:
id | name | filename1 | filename2
1 event1 1.jpg 2.jpg
2 event2 1.jpg Null
如果你看一下这个场景,它应该返回“你有3个文件”,但我不知道如何制作SQL。
我正在使用mySQL。
由于
答案 0 :(得分:5)
您可以取消隐藏或对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
答案 1 :(得分:1)
你的桌子没有正常化,这让你的生活变得困难。如果您拥有一对多关系,例如event:files,则需要2个表,一个用于事件,一个用于属于事件的文件。像这样:
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;
答案 2 :(得分: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建议的那样!