【问题标题】:Working on a mysql database. But i need help on creating a function在mysql数据库上工作。但我需要帮助来创建一个函数
【发布时间】:2015-11-15 05:23:00
【问题描述】:

这是我需要从函数重新创建的结果。

+-----------------+------------+------------+-----------+
| 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

【问题讨论】:

  • 嗨,天使,请提供您在尝试中遇到的具体问题,这样您的问题将在 SO 中得到更好的关注。

标签: mysql


【解决方案1】:

有几个问题

  • 您需要更改为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');

SqlFiddle here

【讨论】:

  • 可能想谈谈分隔符,因为那和小提琴对neebie不起作用
  • @StuartLC 谢谢,我尝试了小提琴中的示例。但是我刚刚在您将“2016/01/01”作为第二个输入的呼叫功能中遇到了问题。你为什么要输入那个日期,因为当你填充表格时,那个日期从来没有出现过?
  • 因为我使用过 DATE 数据类型,我们可以使用 = 和 between 等比较,所以我们有完全匹配以外的选项。
猜你喜欢
  • 2022-07-04
  • 1970-01-01
  • 2014-02-14
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多