mysql - 在 mysql 数据库上工作。但我需要帮助来创建一个函数

标签 mysql

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

+-----------------+------------+------------+-----------+
| 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');

SqlFiddle here

关于mysql - 在 mysql 数据库上工作。但我需要帮助来创建一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33716717/

相关文章:

php - MySql 排除具有特定 ID 的结果?

mysql - 您的 SQL 语法有错误; 'by rand() limit 0,5' 在第 1 行

php - 使用 IP 地址敏感的 View 计数器是否会为 MYSQL/PHP 带来过多的工作量?

php - 无法在 php 中对 sql 结果进行 json_encode

php - Yii2.0完整登录基本模板

mysql - 带有子查询的两个表的总和

c# - 使用 Dapper C# 在 MySQL 命令中使用变量

mysql - SQL 正则表达式以错误的方式工作

mysql - max_user_connections错误含义和修复

mysql - 如何使用 group by 返回最近的值