Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Saman taulun rivien liitokset

manninen [14.11.2012 11:26:46]

#

Samassa taulukossa kahden henkilön yhdistäminen jos id on "ehtokentässä" sama

Henkilon_nimi, Henkilon_yhdiste_id
1 Jussi 2
2 Matti 0
3 Veli 0
4 Marja 2
5 Juuso 3

Tarkoitus olisi siis luoda kysely, joka hakee seuraavanesimerkin mukaisesta taulukosta seuraavan tulostuksen

Jussi , Matti
Matti , -
Veli , -
Marja , Matti
Juuso , Veli

Teuro [14.11.2012 12:26:18]

#

Älä tee noin! Tee uusi taulu, jossa tuo yhdistäminen tehdään. Samalla voit yhdistää useita henkilöitä toisiinsa.

Metabolix [14.11.2012 13:26:24]

#

Kyllä noin voi tehdä, jos oikeasti on tarkoitus, että jokaisella henkilöllä voi olla tasan yksi oma yhteys. Tuloksena on siis verkko, jossa jokaisesta solmusta lähtee yksi nuoli.

Kysymyksesi on aika epämääräinen. Jos joka tapauksessa haet taulusta kaikki henkilöt, helpointa on vain laittaa hakutulos taulukkoon id:n mukaan ja tehdä tulostus tähän malliin:

foreach ($henkilot as $id => $henkilo) {
	$kohde = $henkilot[$henkilo["yhdiste_id"]];
	echo $henkilo["nimi"], " => ", $kohde["nimi"], "\n";
}

Jos haluat hakea vain osan henkilöistä tai muuten vain haluat pitää kaiken SQL-kyselyssä, voit tehdä LEFT JOIN -kyselyn. Tilanne on aivan sama kuin kahdella erillisellä taululla, mutta nyt vain käytetään samaa taulua kahteen kertaan.

SELECT
	h1.nimi AS h1_nimi,
	h2.nimi AS h2_nimi
FROM
	henkilo AS h1
LEFT JOIN
	henkilo AS h2 ON h2.id = h1.yhdiste_id

Muista säätää kantaan myös oikea FOREIGN KEY -viittaus, jotta kaikki id:t varmasti ovat olemassa, ja älä käytä olemattomana arvona lukua 0 vaan arvoa NULL.

manninen [14.11.2012 14:28:27]

#

Kiitos Metabolix!

Periaatteessa pidän ajatuksesta, tehdä sen SQL -kyselyssä, mutta toisaalta tarvitsen mukaan kaikki henkilöt. Ylempi vaihtoehdoista on siis kuin luotu minulle! Kiitos tästä jälleen kerran.

ps. Kysymykseni oli huonosti "esitetty", kun en osannut oikein kertoa mitä haen. Mutta hain juuri tätä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta