2017-03-14 24 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