Avatar billede Slettet bruger
06. april 2012 - 10:48 Der er 1 kommentar og
1 løsning

Hvordan JOIN'er jeg med et land?

Hej eksperter.

Jeg laver et databasekald, hvor jeg bl.a. får returneret en række fremmednøgler til entiteten "country". Imidlertid har jeg ikke brug for at få vist ID'en, men få vist landet, holdet kommer fra.
Det lyder som en simpel JOIN.


SELECT e.id as id,
ts.name as league,
ts.id as leagueid,
tc.name as country,
tc.id as countryid,
s.name as sport,
s.id as sportid,
DATE_FORMAT(e.startdate, '%Y.%m.%d') AS startdate,
DATE_FORMAT(e.startdate, '%H:%i') AS starttime,
MIN(IF( ep.number = 1, p.name, NULL)) AS home_team,
MIN(IF( ep.number = 1, p.countryFK, NULL)) AS home_country,
MIN(IF(ep.number = 2, p.name, NULL)) AS away_team,
MIN(IF( ep.number = 2, p.countryFK, NULL)) AS away_country,
pp.name FROM event AS e
INNER JOIN tournament_stage ts ON ts.id = e.tournament_stageFK
INNER JOIN tournament t ON t.id = ts.tournamentFK
INNER JOIN tournament_template tt ON tt.id = t.tournament_templateFK
INNER JOIN sport s ON s.id = tt.sportFK
INNER JOIN country tc ON tc.id = ts.countryFK
LEFT JOIN property pr ON pr.objectFK = e.id and pr.object='event' AND pr.name='refereeFK' and pr.del='no'
INNER JOIN event_participants AS ep ON e.id = ep.eventFK and ep.del='no'
LEFT JOIN participant AS p ON ep.participantFK = p.id
LEFT JOIN participant AS pp ON pr.`value`=pp.id

WHERE e.startdate > '2012-04-06 08:24:19' AND e.startdate < '2012-04-26 00:00:00' AND e.del = 'no' AND p.del = 'no'
GROUP BY e.id
ORDER BY e.startdate LIMIT 100


Den returnerer dette:
1110372 | Super Rugby | 825067 | Australia | 39| Rugby | 29 | 2012.04.06 | 09:35 | Hurricanes | 93 | Sharks | 28 | NULL

Læg mærke til tallene 93 og 28 - det er dem, vi skal bruge til vores JOIN.
Entiteten "country" er ret enkel: "id" og "name"


Kæden hopper af, fordi p.name og p.country anvender en condition IF, så hvordan får jeg udskiftet fremmednøglerne med landenavne?
Avatar billede Slettet bruger
06. april 2012 - 11:00 #1
Ahr, det er da enkelt:


SELECT e.id as id,
ts.name as league,
ts.id as leagueid,
tc.name as country,
tc.id as countryid,
s.name as sport,
s.id as sportid,
DATE_FORMAT(e.startdate, '%Y.%m.%d') AS startdate,
DATE_FORMAT(e.startdate, '%H:%i') AS starttime,
MIN(IF( ep.number = 1, p.name, NULL)) AS home_team,
MIN(IF( ep.number = 1, p.countryFK, NULL)) AS home_country,
MIN(IF(ep.number = 1, c.name, NULL)) AS homeC, <--------- NY
MIN(IF(ep.number = 2, p.name, NULL)) AS away_team,
MIN(IF( ep.number = 2, p.countryFK, NULL)) AS away_country,
MIN(IF(ep.number = 2, c.name, NULL)) AS awayC, <--------- NY
pp.name FROM event AS e
INNER JOIN tournament_stage ts ON ts.id = e.tournament_stageFK
INNER JOIN tournament t ON t.id = ts.tournamentFK
INNER JOIN tournament_template tt ON tt.id = t.tournament_templateFK
INNER JOIN sport s ON s.id = tt.sportFK
INNER JOIN country tc ON tc.id = ts.countryFK
LEFT JOIN property pr ON pr.objectFK = e.id and pr.object='event' AND pr.name='refereeFK' and pr.del='no'
INNER JOIN event_participants AS ep ON e.id = ep.eventFK and ep.del='no'
LEFT JOIN participant AS p ON ep.participantFK = p.id
LEFT JOIN participant AS pp ON pr.`value`=pp.id
LEFT JOIN country AS c ON p.countryFK = c.id <--------- NY

WHERE e.startdate > '2012-04-06 08:24:19' AND e.startdate < '2012-04-26 00:00:00' AND e.del = 'no' AND p.del = 'no'
GROUP BY e.id
ORDER BY e.startdate LIMIT 100
06. april 2012 - 12:57 #2
Det var godt du fandt ud af det selv, for jeg tror ikke der er mange der har lyst til at hjælpe før du får orden på dine gamle spørgsmål.  Du har et meget stort antal spørgsmål hvor du ikke har reageret på indlæg fra de der prøvede at hjælpe og ikke har lukket og afgivet de udlovede points.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester