2017-03-14 23 views
0

我有星球大战人物名单的模式,看电影,他们出现在,他们参观等。这里的行星是模式:MySQL的过程与参数语法

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

你可能需要使用'JOIN'和'GROUP BY'。你能向我们展示这些表结构和可能的一些样本数据吗? – codtex

+0

你的程序语法很好。看起来好像你不懂如何编写连接表的查询。 – Barmar

+0

@sand我添加了模式以供参考。 @ barmar不,因为我只是在学习如何编写函数,你能解释一下吗? – salivad

回答

0

Hello_ friend。

首先感谢您发布数据库的架构它确实有帮助。从中我能做出这样的画面:

enter image description here

而且我已经改变了你的代码,以这样的:

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首先对地球的名称,然后在电影名称,以便将特定影片

指望一个特定的星球人物,就是这样......

希望这是有帮助的。请让我知道这对你有没有用。

干杯!

+0

谢谢!有没有办法我可以和你聊天问几个问题? – salivad

+0

是肯定的,只是不知道如何创建一个私人聊天 – codtex

+0

[这里是聊天](http://chat.stackoverflow.com)我相信 – salivad