Gå til innhold

Hvordan hente ut både NULL og id'er?


Anbefalte innlegg

Jeg holder på med et system for en fotballturnering, og en del av dette systemet innebærer å sette opp kampoppsett. Jeg har da i den sammenheng litt problemer med å få hentet ut data skikkelig. Her er relevante db-tabeller: http://norskwebforum.no/pastebin/1226

 

Slik ser spørringen min ut:

SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane',
kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato',
kamp.tid,kamp.hid,kamp.bid,lag.lagid, lag.navn 'hjemmelag',
lag.navn 'bortelag', kamp.hmaal,kamp.bmaal
FROM kamp, bane, sesong, dato, lag
WHERE kamp.baneid = bane.baneid
AND kamp.sesongid = sesong.sesongid
AND sesong.navn = 2005
AND kamp.datoid = dato.datoid
AND (kamp.hid = lag.lagid OR kamp.bid = lag.lagid)

 

Men her blir det noe kluss med hjemmelag og bortelag, så jeg aner ikke hvordan jeg skal skrive det i spørringen. Slik blir det nå:

http://www.fyllingenfotball.no/ikke_slett/...r_problemer.gif

 

Men som dere ser kommer de to kampene i tabellen ut to ganger, samt at hjemmelag og bortelag blir skrevet ut identisk. Noen som kunne hjulpet meg med spørringen? Skal altså ha med de feltene dere ser på bildet.

 

På forhånd takk!

Endret av remi sture
Lenke til kommentar
Videoannonse
Annonse
SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane',
kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato',
kamp.tid,kamp.hid,kamp.bid,lag.lagid, hlag.navn 'hjemmelag',
blag.navn 'bortelag', kamp.hmaal,kamp.bmaal
FROM kamp, bane, sesong, dato, lag hlag, lag blag
WHERE kamp.baneid = bane.baneid
AND kamp.sesongid = sesong.sesongid
AND sesong.navn = 2005
AND kamp.datoid = dato.datoid
AND kamp.hid = hlag.lagid AND kamp.bid = blag.lagid

Lenke til kommentar
Takk for den, kaffenils, men får følgende feilmelding: #1109 - Unknown table 'lag' in field list

Min feil, jeg så ikke alle lag-referansene.

 

Denne skal virke:

SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane',
kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato',
kamp.tid,kamp.hid,kamp.bid,hlag.lagid 'hjemmelag_id', hlag.navn 'hjemmelag',
blag.lagid 'bortelag_id', blag.navn 'bortelag', kamp.hmaal,kamp.bmaal
FROM kamp, bane, sesong, dato, lag hlag, lag blag
WHERE kamp.baneid = bane.baneid
AND kamp.sesongid = sesong.sesongid
AND sesong.navn = 2005
AND kamp.datoid = dato.datoid
AND kamp.hid = hlag.lagid AND kamp.bid = blag.lagid

Lenke til kommentar

Da var jeg tilbake med nytt spørsmål. Jeg trenger å få hentet ut klasse og gruppe for hver kamp også. I lagtabellen har jeg to felter som heter klasseid og gruppeid, som peker til primærnøklene i klasse og gruppe. Hvordan kan jeg få hentet ut klasse og gruppe fra enten hjemmelaget eller bortelaget, eventuelt begge to? Både hjemmelag og bortelag skal ligge i samme klasse og gruppe, så trenger sikkert bare å hente dette fra et av lagene.

 

Slik ser min nåværende spørring ut:

SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane', kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato', kamp.tid, kamp.hid, kamp.bid, hlag.lagid 'hjemmelag_id', hlag.navn 'hjemmelag', blag.lagid 'bortelag_id', blag.navn 'bortelag', kamp.hmaal, kamp.bmaal, kamp.dommerid, dommer.dommerid, dommer.navn 'dommer'
FROM kamp, bane, sesong, dato, lag hlag, lag blag, dommer
WHERE kamp.baneid = bane.baneid
AND kamp.sesongid = sesong.sesongid
AND sesong.navn = '$_REQUEST[sesong]'
AND kamp.datoid = dato.datoid
AND kamp.dommerid = dommer.dommerid
AND kamp.hid = hlag.lagid AND kamp.bid = blag.lagid
ORDER BY kamp.tid ASC, bane.navn ASC

 

Prøvde også denne, men da fikk jeg bare ut halvparten av kampene:

SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane', kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato', kamp.tid, kamp.hid, kamp.bid, hlag.lagid 'hjemmelag_id', hlag.klasseid, blag.klasseid, klasse.klasseid, klasse.navn 'klasse', hlag.gruppeid, blag.gruppeid, gruppe.gruppeid, gruppe.navn 'gruppe', hlag.navn 'hjemmelag', blag.lagid 'bortelag_id', blag.navn 'bortelag', kamp.hmaal, kamp.bmaal, kamp.dommerid, dommer.dommerid, dommer.navn 'dommer'
FROM kamp, bane, sesong, dato, lag hlag, lag blag, dommer, klasse, gruppe
WHERE kamp.baneid = bane.baneid
AND kamp.sesongid = sesong.sesongid
AND sesong.navn = '$_REQUEST[sesong]'
AND kamp.datoid = dato.datoid
AND kamp.dommerid = dommer.dommerid
AND kamp.hid = hlag.lagid AND kamp.bid = blag.lagid
AND hlag.klasseid = klasse.klasseid
AND blag.klasseid = klasse.klasseid
AND hlag.gruppeid = gruppe.gruppeid
AND blag.gruppeid = gruppe.gruppeid
ORDER BY kamp.tid ASC, bane.navn ASC

 

Slik ser tabellene ut: http://norskwebforum.no/pastebin/1241

Endret av remi sture
Lenke til kommentar

Strange! Plutselig funket dette:

SELECT kamp.kampid, kamp.baneid, bane.baneid, bane.navn 'bane', kamp.sesongid, sesong.sesongid, sesong.navn 'sesong', kamp.datoid, dato.datoid, dato.ddmm 'dato', kamp.tid, kamp.hid, kamp.bid, hlag.lagid 'hjemmelag_id', hlag.navn 'hjemmelag', hlag.klasseid, hlag.gruppeid, klasse.navn 'klasse', gruppe.navn 'gruppe', blag.lagid 'bortelag_id', blag.navn 'bortelag', kamp.hmaal, kamp.bmaal, kamp.dommerid, dommer.dommerid, dommer.navn 'dommer'
 	FROM kamp, bane, sesong, dato, lag hlag, lag blag, dommer, klasse, gruppe
 	WHERE kamp.baneid = bane.baneid
 	AND kamp.sesongid = sesong.sesongid
 	AND sesong.navn = '$_REQUEST[sesong]'
 	AND hlag.klasseid = klasse.klasseid
 	AND hlag.gruppeid = gruppe.gruppeid
 	AND kamp.datoid = dato.datoid
 	AND kamp.dommerid = dommer.dommerid
 	AND kamp.hid = hlag.lagid 
 	AND kamp.bid = blag.lagid
 	ORDER BY dato.ddmm ASC, kamp.tid ASC, bane.navn ASC

Lenke til kommentar

Hei igjen!

 

Nå er det et nytt SQL-problem igjen. Følgende spørring gir meg denne feilen: "#1109 - Unknown table 'lag' in on clause" . hid og bid skal peker til lagid i lagtabellen jeg også har, men som dere ser skal denne også kunne inneholder NULL (før det er klart hvilke lag som egentlig skal spille den aktuelle kampen).

SELECT sluttspill.sluttspillid, sluttspill.baneid, bane.navn 'bane', sluttspill.dommerid, dommer.navn 'dommer', sluttspill.sesongid, sluttspill.datoid, dato.ddmm 'dato', sluttspill.tid,
sluttspill.hid, hlag.navn 'hjemmelag', blag.navn 'bortelag', sluttspill.bid, sluttspill.hmaal, sluttspill.bmaal, sluttspill.info
 	FROM sluttspill
 	LEFT OUTER JOIN bane ON (sluttspill.baneid = bane.baneid)
 	LEFT OUTER JOIN dommer ON (sluttspill.dommerid = dommer.dommerid)
 	LEFT OUTER JOIN dato ON (sluttspill.datoid = dato.datoid)
 	LEFT OUTER JOIN lag hlag ON (sluttspill.hid = lag.lagid)
 	LEFT OUTER JOIN lag blag ON (sluttspill.bid = lag.lagid)
 	LEFT OUTER JOIN sesong ON (sluttspill.sesongid = sesong.sesongid) 
 	WHERE sesong.navn = '$_REQUEST[sesong]'
 	AND sluttspill.datoid = dato.datoid
 	AND sluttspill.dommerid = dommer.dommerid
 	AND sluttspill.baneid = bane.baneid
 	AND sluttspill.hid = hlag.lagid 
 	AND sluttspill.bid = blag.lagid

Slik ser sluttspill-tabellen ut:

CREATE TABLE `sluttspill` (
 `sluttspillid` smallint(5) NOT NULL auto_increment,
 `baneid` smallint(5) NOT NULL default '0',
 `dommerid` smallint(5) NOT NULL default '0',
 `sesongid` smallint(5) NOT NULL default '0',
 `datoid` smallint(5) NOT NULL default '0',
 `tid` varchar(5) default NULL,
 `hid` smallint(5) default NULL,
 `bid` smallint(5) default NULL,
 `hmaal` smallint(2) default NULL,
 `bmaal` smallint(2) default NULL,
 `info` varchar(100) default NULL,
 PRIMARY KEY  (`sluttspillid`)
) TYPE=MyISAM COMMENT='Sluttspill' AUTO_INCREMENT=3;

-- 
-- Dataark for tabell `sluttspill`
-- 

INSERT INTO `sluttspill` VALUES (2, 1, 3, 1, 32, '09:25', NULL, NULL, NULL, NULL, 'Kl. J - Nr. 1 Gr. 1 vs. Nr. 2 Gr. 2');

 

Hvis jeg derimot bruker denne spørringen her, kommer det fram som jeg ønsker, bortsett fra hid og bid, naturlig nok. Så spørsmålet blir vel egentlig hva som må tilføyes i den under for at jeg også kan få vist hjemmelag (hid) og bortelag (bid):

SELECT sluttspill.sluttspillid, sluttspill.baneid, bane.navn 'bane', sluttspill.dommerid, dommer.navn 'dommer', sluttspill.sesongid, sluttspill.datoid, dato.ddmm 'dato', sluttspill.tid,
sluttspill.hid, sluttspill.bid, sluttspill.hmaal, sluttspill.bmaal, sluttspill.info
 	FROM sluttspill
 	LEFT OUTER JOIN bane ON (sluttspill.baneid = bane.baneid)
 	LEFT OUTER JOIN dommer ON (sluttspill.dommerid = dommer.dommerid)
 	LEFT OUTER JOIN dato ON (sluttspill.datoid = dato.datoid)
 	LEFT OUTER JOIN sesong ON (sluttspill.sesongid = sesong.sesongid) 
 	WHERE sesong.navn = '$_REQUEST[sesong]'
 	AND sluttspill.datoid = dato.datoid
 	AND sluttspill.dommerid = dommer.dommerid
 	AND sluttspill.baneid = bane.baneid

Endret av remi sture
Lenke til kommentar

Hei igjen! Vet jeg maser, men trenger virkelig hjelp her. Står fast. Med denne spørringer her, får jeg ut de radene hvor hid og bid IKKE inneholder NULL. Hvordan kan jeg også få skrevet ut disse radene? Altså det skal skrives ut både hvis hid og bid inneholder en id og hvis de inneholder NULL.

SELECT sluttspill.sluttspillid, sluttspill.baneid, bane.navn 'bane', sluttspill.dommerid, dommer.navn 'dommer', sluttspill.sesongid, sluttspill.datoid, dato.ddmm 'dato', sluttspill.tid, sluttspill.hid, hlag.lagid 'hjemmeid', hlag.navn 'hjemmelag', blag.lagid 'borteid', blag.navn 'bortelag', sluttspill.bid, sluttspill.hmaal, sluttspill.bmaal, sluttspill.info
 	FROM sluttspill
 	LEFT OUTER JOIN bane ON (sluttspill.baneid = bane.baneid)
 	LEFT OUTER JOIN dommer ON (sluttspill.dommerid = dommer.dommerid)
 	LEFT OUTER JOIN dato ON (sluttspill.datoid = dato.datoid)
 	LEFT OUTER JOIN sesong ON (sluttspill.sesongid = sesong.sesongid)
 	LEFT OUTER JOIN lag hlag ON (sluttspill.hid = hlag.lagid) 
 	LEFT OUTER JOIN lag blag ON (sluttspill.bid = blag.lagid)
 	WHERE sesong.navn = '$_REQUEST[sesong]'
 	AND sluttspill.datoid = dato.datoid
 	AND sluttspill.dommerid = dommer.dommerid
 	AND sluttspill.baneid = bane.baneid
 	AND sluttspill.hid = hlag.lagid
 	AND sluttspill.bid = blag.lagid

Endret av remi sture
Lenke til kommentar

Du trenger ikke å bruke LEFT OUTER JOIN lag hlag ON (sluttspill.hid = hlag.lagid) og AND sluttspill.hid = hlag.lagid, det blir bare smør på flesk.

 

Bruk av JOIN synes jeg er den riktige måten å skrive spørringer på fordi de gir bedre lesbarhet, men det er bare min mening.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...