我正在尝试构建一个 SQL,它将返回所有事件的文件总量。
D B:
id | name | filename1 | filename2
1 event1 1.jpg 2.jpg
2 event2 1.jpg Null
如果您查看这种情况,它应该返回“您有 3 个文件”,但我不知道如何制作 SQL。
我正在使用 mySQL。
谢谢
您可以取消透视或使用and字段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
你的桌子没有标准化,这让你的生活变得困难。当您有像 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;
当那里没有文件名时,您没有指定列中的内容,我假设它是 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
此外,这个数据库结构确实不好。正如 dnagirl 建议的那样,它应该被标准化!