0

我正在尝试构建一个 SQL,它将返回所有事件的文件总量。

D B:

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

如果您查看这种情况,它应该返回“您有 3 个文件”,但我不知道如何制作 SQL。

我正在使用 mySQL。

谢谢

4

3 回答 3

5

您可以取消透视或使用and字段UNION ALL中的数据,然后获得总计数。从多列中获取数据并将其转换为多行:filename1filename2UNION 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 这样的一对多关系时,您需要 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;
于 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

此外,这个数据库结构确实不好。正如 dnagirl 建议的那样,它应该被标准化!

于 2013-01-16T16:10:06.117 回答