【问题标题】:MySQL Procedure with parameter syntax带参数语法的 MySQL 过程
【发布时间】:2017-08-05 09:27:02
【问题描述】:

我有一个架构,其中包含星球大战中的角色列表、他们出现的电影、他们访问的行星等。这是架构:

CREATE DATABASE  IF NOT EXISTS `starwarsFINAL` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `starwarsFINAL`;

DROP TABLE IF EXISTS `characters`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `characters` (
  `character_name` varchar(45) NOT NULL,
  `race` varchar(45) DEFAULT NULL,
  `homeworld` varchar(45) DEFAULT 'Unknown',
  `affiliation` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`character_name`),
   KEY `planet_fk` (`homeworld`),
  CONSTRAINT `planet_fk` FOREIGN KEY (`homeworld`) REFERENCES `planets`     (`planet_name`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `movies`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `movies` (
  `movie_id` int(11) NOT NULL,
  `title` varchar(128) DEFAULT NULL,
  `scenes_in_db` int(11) DEFAULT NULL,
  `scenes_in_movies` int(11) DEFAULT NULL,
  PRIMARY KEY (`movie_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `planets`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `planets` (
  `planet_name` varchar(45) NOT NULL,
  `planet_type` varchar(30) DEFAULT NULL,
  `affiliation` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`planet_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

DROP TABLE IF EXISTS `timetable`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `timetable` (
  `character_name` varchar(45) DEFAULT NULL,
  `planet_name` varchar(45) DEFAULT 'Unknown',
  `movie_id` int(11) DEFAULT NULL,
  `arrival` int(11) DEFAULT NULL,
  `departure` int(11) DEFAULT NULL,
  `time_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`time_id`),
  UNIQUE KEY `timetable_un`     (`character_name`,`planet_name`,`movie_id`,`arrival`),
  KEY `timetable_fkplanet` (`planet_name`),
  KEY `timetable_fkmovie` (`movie_id`),
  CONSTRAINT `timetable_fkcharacter` FOREIGN KEY (`character_name`) REFERENCES     `characters` (`character_name`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `timetable_fkmovie` FOREIGN KEY (`movie_id`) REFERENCES `movies`     (`movie_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `timetable_fkplanet` FOREIGN KEY (`planet_name`) REFERENCES     `planets` (`planet_name`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

这是我的问题:

编写一个过程track_planet(planet),接受行星名称并返回 包含行星名称、电影名称和数量的结果集 在那部电影中出现在那个星球上的角色。

这是我到目前为止所拥有的,但我迷失/卡住了如何让它发挥作用。 (我是 MySQL 新手)

DROP PROCEDURE IF EXISTS track_planet;
DELIMITER $$
CREATE PROCEDURE track_planet(IN planet VARCHAR(45))
BEGIN
    SELECT planet_name FROM planets, title FROM movies, 
    COUNT(DISTINCT character_name) FROM characters WHERE planet_name = planet;
END
DELIMITER;

【问题讨论】:

  • 您可能需要使用JOINGROUP BY。你能向我们展示那些表格结构和一些示例数据吗?
  • 您的过程语法很好。您似乎不明白如何编写连接表的查询。
  • @sand 我添加了架构以供参考。 @barmar 不,我不知道,因为我只是在学习如何编写函数,你能解释一下吗?

标签: mysql stored-procedures mysql-workbench procedure


【解决方案1】:

你好_朋友。

首先感谢您发布数据库的架构,它确实很有帮助。从中我可以制作出这张照片:

我已将您的代码更改为:

DELIMITER $$

DROP PROCEDURE IF EXISTS track_planet $$

CREATE PROCEDURE track_planet(IN planet VARCHAR(45))
BEGIN
    SELECT 
    tt.planet_name as planetName, m.title as movieName, COUNT(tt.character_name) as characters
    FROM timetable tt 
    LEFT JOIN movies m ON tt.movie_id = m.movie_id
    WHERE tt.planet_name = planet
    GROUP BY planetName, movieName;
END $$

DELIMITER ;

函数声明的代码几乎相同,只是做了一些修改。

主要变化是SELECT声明:

  1. 选择必要的列;
  2. 看来timetable里面的大部分信息你都掌握了,所以只能加入movies来获取电影名称;
  3. 先在行星名称上使用GROUP BY,然后在电影名称上使用,这样它就会按特定电影计算特定星球上的字符数

就是这样……

希望这对您有所帮助。让我知道它是否适合你。

干杯!

【讨论】:

  • 谢谢!有什么方法可以和你聊天问几个问题吗?
  • 是的,只是不知道如何创建私人聊天
  • 是的,但是房间太多:)。也许只是在这里问我问题,我会尽力回答你
  • 我有很多,我希望看看你是否可以查看我的其余作业并告诉我它看起来是否正确
  • 检查我的个人资料有一封电子邮件,把你的东西和问题发给我,我可以看到我能做什么。但我至少可以在 16 小时后给你答复,因为现在我要睡觉了,明天晚上我可以上网
猜你喜欢
  • 2018-05-22
  • 2021-07-02
  • 2011-11-25
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2016-08-20
相关资源
最近更新 更多