मेरी आपको सबसे अच्छी सलाह है, ऐसा मत करो। डेटाबेस में अन्य जानकारी से प्राप्त की जा सकने वाली जानकारी को संग्रहीत करना आमतौर पर बहुत खराब डिज़ाइन माना जाता है, और डेटाबेस में पंक्तियों के क्रम पर भरोसा करने का प्रयास किया जाता है। पागलपन का पक्का रास्ता है।
यहां आपकी तालिका को सामान्य बनाने का पहला पास दिया गया है:
-- Table: teams
-- DROP TABLE teams;
CREATE TABLE teams
(
team_id character(3) primary key,
team_name varchar(255),
team_city varchar(255)
) engine=innodb;
-- Table: starting_pitchers_game_log
-- DROP TABLE starting_pitchers_game_log;
CREATE TABLE starting_pitchers_game_log
(
pitcher_id character(10) NOT NULL,
game_date date NOT NULL,
opposing_team character(3),
game_seq integer NOT NULL,
outcome character(1),
innings_pitched real,
bfp integer,
hits integer,
runs integer,
errors integer,
homeruns integer,
bb integer,
k integer,
ibb integer,
hbp integer,
wp integer,
balks integer,
CONSTRAINT starting_pitcher_log_pk
PRIMARY KEY (pitcher_id , game_date , game_seq ),
CONSTRAINT team_fk FOREIGN KEY (opposing_team)
REFERENCES teams (team_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
) engine=innodb;
(मैं बेसबॉल का अनुसरण नहीं करता, इसलिए मैं केवल कुछ कॉलम नामों का अनुमान लगा सकता था।) ध्यान दें कि year_id
, month_id
और day_id
कॉलम चले गए हैं, क्योंकि उन मानों को game_date
. से फिर से बनाया जा सकता है कॉलम जैसा कि मैंने टिप्पणियों में संकेत दिया है। साथ ही आपका game_id
स्तंभ चला गया है; इसे opposing_team
. को जोड़कर फिर से बनाया जा सकता है , game_date
और game_seq
(जो मुझे लगता है कि डबल-हेडर और सी के लिए खाता है।) मैंने W
को भी परिवर्तित कर दिया है और L
"डब्ल्यू" (जीत), "एल" (हानि), और "टी" (टाई) मानों को रखने के उद्देश्य से एक कॉलम में।
teams
तालिका 3-चार टीम आईडी के लिए एक लुकअप तालिका प्रदान करती है। इसे किसी अन्य टीम डेटा को रखने के लिए विस्तारित किया जा सकता है जो आप चाहते हैं। (ध्यान दें कि यह टीम का वर्णन करने के लिए है स्वयं; टीम गतिविधियां दूसरी तालिका में जाएगा।)
"बाधा" खंड के बारे में आपके प्रश्न का उत्तर देने के लिए, पहला (CONSTRAINT starting_pitcher_log_pk
और इसके नीचे इंडेंट लाइन) निर्दिष्ट करता है कि उन तीन स्तंभों का संयोजन तालिका में प्रत्येक पंक्ति के लिए प्राथमिक विशिष्ट पहचानकर्ता के रूप में कार्य करता है। दूसरा वाला (CONSTRAINT team_fk FOREIGN KEY (opposing_team)
और उसके नीचे इंडेंटेड लाइन) का मतलब है कि किसी मान को opposing_team
में रखा जाना है यह कॉलम पहले से मौजूद होना चाहिए teams.team_id
. में कॉलम; आप उस टीम के खिलाफ नहीं खेल सकते जो मौजूद नहीं है।
अब वास्तव में आपके मूल प्रश्न का उत्तर देने पर काम करना है। सबसे अच्छा समाधान मैं MySQL पर एक स्क्रैच टेबल और एक संग्रहीत प्रक्रिया के साथ आ सकता था, जो निम्नानुसार है:
-- Table: ip_subtotal
-- DROP TABLE ip_subtotal;
CREATE TABLE ip_subtotal
(
pitcher_id char(10) NOT NULL,
game_date date NOT NULL,
game_seq int(11) NOT NULL,
innings_pitched double,
ip_total double DEFAULT '0.0',
CONSTRAINT ip_subtotal_pk
PRIMARY KEY (pitcher_id , game_date , game_seq )
) ENGINE=InnoDB;
और संग्रहित प्रक्रिया:
------------------------------------------------------------------------------ --
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE PROCEDURE accumulate_innings()
BEGIN
DECLARE pit_id CHAR(10);
DECLARE gdate DATE;
DECLARE seq INT;
DECLARE in_pit REAL;
DECLARE accum REAL;
DECLARE prev_year YEAR(4);
DECLARE end_of_cursor BOOLEAN;
DECLARE c1 CURSOR FOR
SELECT pitcher_id, game_date, game_seq, innings_pitched
FROM ip_subtotal
ORDER BY pitcher_id, game_date, game_seq;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET end_of_cursor := TRUE;
TRUNCATE TABLE ip_subtotal;
INSERT INTO ip_subtotal
SELECT pitcher_id, game_date, game_seq, innings_pitched, 0.0
FROM starting_pitchers_game_log;
SET prev_year := 0;
OPEN c1;
fetch_loop: LOOP
FETCH c1 INTO pit_id, gdate, seq, in_pit;
IF end_of_cursor THEN
LEAVE fetch_loop;
END IF;
IF YEAR(gdate) != prev_year THEN
SET accum := 0.0;
SET prev_year := YEAR(gdate);
END IF;
SET accum := accum + in_pit;
UPDATE ip_subtotal
SET ip_total = accum
WHERE pitcher_id = pit_id
AND game_date = gdate
AND game_seq = seq;
END LOOP;
CLOSE c1;
END
यह प्रक्रिया तालिका ip_subtotal
. को साफ़ करती है , इसे मुख्य टेबल से पॉप्युलेट करता है, फिर पिच की गई पारी के लिए रनिंग टोटल को रोल अप करता है। यह वर्ष की शुरुआत में संचायक को रीसेट करने के लिए एक साधारण नियंत्रण-विराम का भी उपयोग करता है। आपके द्वारा क्रियान्वित करके प्रक्रिया चलाने के बाद
CALL accumulate_innings();
आप ip_subtotal
. को क्वेरी कर सकते हैं तालिका या इसे वापस starting_pitchers_game_log
. में शामिल करें इच्छानुसार तालिका।
प्रारंभ और समाप्ति तिथि को स्वीकार करने के लिए प्रक्रिया को भी बढ़ाया जा सकता है; मैं इसे पाठक के लिए एक अभ्यास के रूप में छोड़ता हूं।
उम्मीद है ये मदद करेगा; यह दिलचस्प था और मुझे थोड़ा MySQL सीखने के लिए मजबूर किया।