如何创建SQL语句以计算行中的值

时间:2013-01-16 16:03:34

标签: mysql sql

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

DB:

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

如果你看一下这个场景,它应该返回“你有3个文件”,但我不知道如何制作SQL。

我正在使用mySQL。

由于

3 个答案:

答案 0 :(得分:5)

您可以取消隐藏或对UNION ALLfilename1字段中的数据使用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 with Demo

答案 1 :(得分:1)

你的桌子没有正常化,这让你的生活变得困难。如果您拥有一对多关系,例如event:files,则需要2个表,一个用于事件,一个用于属于事件的文件。像这样:

事件

event_id int unsigned not null auto_increment
event_name varchar(45)
....

eventfiles

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建议的那样!