06. april 2012 - 10:48Der 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?
SailGP er en spændende gren af sejlsporten, der byder på intens højhastighedskonkurrence mellem 10 landshold, der sejler identiske F50-katamaraner.
13. maj 2024
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
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.
Synes godt om
Ny brugerNybegynder
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.