Unique problem

Its_TV

Benutzer
Beiträge
5
Guten Tag,
ich erstelle zur Zeit eine Fußballdatenbank. Ich generiere mir einen Spielplan aus einer temporären Tabelle. Diese besteht aus dem Kreuzprodukt der Vereine, die in Heim und Gast doppelt auftreten.

Bei der Spielplantabelle sind Heimteam und Gastteam auf unique.
So werden die ersten 2 Teams mittels cursor in Heim und Gast gezogen und danach aus der temporären Tabelle rausgelöscht. Da Heim und Gast unique sind können für den Spieltag nun die Heim und Gast Teams nicht noch einmal Heim oder Gast sein.

Jedoch bsp: Dortmund - Köln 1. Spiel erstellt er direkt Köln _ Dormund als zweites Spiel. Wie kann ich das unique setzen, das Dortmund und Köln sich nicht tauschen und dann noch einmal auftauchen.
 
Werbung:
Naja, du suchst wohl sowas:

Code:
test=*# create table its_tv (a int, b int);
CREATE TABLE
test=*# create unique index idx_ab on its_tv (greatest(a,b),least(a,b));
CREATE INDEX
test=*# insert into its_tv values (3,8);
INSERT 0 1
test=*# insert into its_tv values (8,3);
ERROR:  duplicate key value violates unique constraint "idx_ab"
DETAIL:  Key (GREATEST(a, b), LEAST(a, b))=(8, 3) already exists.
test=*#

a und b sind dann die foreign keys zu den Mannschaften.
 
Hmm verstehe ich leider noch nicht ganz. Hier einmal mein Code. Vielleicht kannst du damit eher was anfangen:

#Temporäre Tabelle
create temporary table alleSpiele as ( select t1.name as heim, t2.name as gast from (select Name from Verein) as t1, (select Name from Verein) as t2 where t1.Name != t2.Name);

#unique
create temporary table alleSpiele as ( select t1.name as heim, t2.name as gast from (select Name from Verein) as t1, (select Name from Verein) as t2 where t1.Name != t2.Name);

#procedure
delimiter //

create procedure spieltag (in spieltag int)
BEGIN

declare finished int default 0;
declare ende int default 0;
declare team1 varchar(45) default null;
declare team2 varchar(45) default null;

declare vereinscursor cursor for select Heim, Gast from alleSpiele;
declare continue handler for not found set finished := 1;
declare continue handler for 1062 set ende := 1;

open vereinscursor;

repeat
fetch vereinscursor into team1, team2;

if finished = 0 then
insert into Spiel (Spieltag, Datum, Uhrzeit, Heim, Gast) values (spieltag, current_date(),'15:30',team1,team2);
end if;
until finished = 1
END repeat;

close vereinscursor;

END//
 
Hrm.

Du hast z.B. 10 Mannschaften und willst daraus für einen Spieltag Kombinationen finden, oder wie?

Code:
test=*# with r as (select *, (1 + row_number() over ()) / 2 as r from mannschaften order by random()) select string_agg(name,', ') from r group by r;
   string_agg   
-----------------
 team 5, team 6
 team 10, team 9
 team 7, team 8
 team 4, team 3
 team 1, team 2
(5 rows)

test=*# with r as (select *, (1 + row_number() over ()) / 2 as r from mannschaften order by random()) select string_agg(name,', ') from r group by r;
   string_agg   
-----------------
 team 6, team 5
 team 10, team 9
 team 8, team 7
 team 3, team 4
 team 1, team 2
(5 rows)

test=*# with r as (select *, (1 + row_number() over ()) / 2 as r from mannschaften order by random()) select string_agg(name,', ') from r group by r;
   string_agg   
-----------------
 team 6, team 5
 team 10, team 9
 team 8, team 7
 team 3, team 4
 team 2, team 1
(5 rows)

Das wären nun zufällige Kombinationen. Man könnte auch alle möglichen rausfinden, und da einfach dann den Spieltag definieren.
 
Hm also ich habe eine Tabelle Vereine mit 6 Mannschaften. Mit der temporären Tabelle zieht er sich jede mögliche Partie. Wenn eine Partie erstellt wird, wird diese auch aus der temporären Tabelle gelöscht. Wenn nun Dortmund nochmal Heim spiel geht es nicht, da Heim unique ist und Gast ebenso. Jedoch geht es wenn Dortmund und Köln getauscht werden. Da möchte ich eig das er sagt. Halt ist auch unique weil heim und hast schon einmal verwendet wurde
 
Werbung:
Wie wär's damit :)

create table match (
team_id bigint,
match_day date,
match_id bigint ,
<other fields>,
primary key match_pk
(team_id, match_day, match_id)
);
 
Zurück
Oben