这是我需要从函数重新创建的结果。
+-----------------+------------+------------+-----------+
| exhibition_name | start_date | end_date | Paintings |
+-----------------+------------+------------+-----------+
| E1 | 12-18-2015 | 12-18-2015 | 7 |
| E2 | 11-10-2015 | 11-13-2015 | 2 |
| Scupture show | 10-20-2015 | 10-25-2015 | 4 |
+-----------------+------------+------------+-----------+
下面的这些表是我正在使用的以及我已经在其中插入值的值
CREATE TABLE Exhibition(
name VARCHAR(15) NOT NULL,
start_date VARCHAR(11),
end_date VARCHAR(11),
PRIMARY KEY (name)
);
CREATE TABLE Shown_at(
art INT NOT NULL,
exhibition_name VARCHAR(15) NOT NULL,
PRIMARY KEY (art, exhibition_name),
FOREIGN KEY (art) REFERENCES Art_object(id_no),
FOREIGN KEY (exhibition_name) REFERENCES Exhibition(name)
);
这是我尝试完成的功能。
CREATE FUNCTION No_of_painting_exhibited(exhb_name VARCHAR(15), startd VARCHAR(11), enddVARCHAR(11), num_paint INT)
RETURNS VARCHAR(15), VARCHAR(11), VARCHAR(11), INT
DETERMINISTIC
SELECT exhibition_name, start_date, end_date, COUNT(*) as Paintings
FROM Shown_at, Exhibition
WHERE name = exhibition_name
Group by exhibition_name;
END
最佳答案
有几个问题
- 您需要更改为 Procedure, not a function为了返回一个表
- 绘画的数量是一个输出,所以你可以去掉
num_paint
参数 - 由于展览名称是主键,如果您打算显示许多展览的分组列表,则不希望将其作为输入
- 看来您希望使用开始日期和结束日期作为参数
- 您应该为日期使用强日期类型,而不是 VARCHAR
- 请使用 ANSI JOINS 连接表,而不是在 where 子句上连接
- 您可以考虑为展览使用代理键(例如另一个 ID、GUID 等)——名称可能是一个有问题的选择。
怎么样(使用 DELIMITER
而不是 ;
,例如 //
):
CREATE PROCEDURE No_of_painting_exhibited(
startd DATE,
endd DATE)
BEGIN
SELECT exhibition_name, start_date, end_date, COUNT(*) as Paintings
FROM Exhibition
INNER JOIN Shown_at
ON name = exhibition_name
WHERE end_date >= startd and start_date <= endd
GROUP BY exhibition_name, start_date, end_date;
END;
这样执行:
CALL No_of_painting_exhibited('2015/11/01','2016/01/01');
关于mysql - 在 mysql 数据库上工作。但我需要帮助来创建一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716717/