Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySql: Kyselyn antaa oudon tuloksen

mika_jussi [08.09.2004 15:22:59]

#

Osaisiko joku selittää tietämättömälle, miksi seuraava kysely antaa tulokseksi yhden ainoan rivin toistettuna ties kuinka monta tuhatta kertaa? Todellisia osumia olisi tullut useita.

--------------------------------------------

SELECT taulukko1.sarake1, taulukko1.sarake2, taulukko1.sarake3
FROM taulukko1, taulukko2
WHERE (
taulukko1.sarake4 = taulukko2.sarake1
) AND taulukko2.sarake2 =6 OR 12;

--------------------------------------------

En ymmärrä sitä, miksi FROM-lauseessa tarvitaan myös "taulukko2", mutta ilman sitä sain virheilmoituksen.


Toinen kysymys liittyy taulukoiden luontiin. Miten pystyn luomaan uuden taulukon kyselyn antamasta tuloksesta, eli jos olen hakenut eri taulukoista tietoa, jotka tulostuvat kyselyn avulla, miten saan niistä tiedoista uuden taulukon?

Pyydän anteeksi, jos kysymykseni ovat järjettömiä - tässä vielä harjoitellaan..

Olga [08.09.2004 16:52:25]

#

Taulukko2 sitä varten, että sen kenttä esiintyy tuolla WHERE-osassa. Ja OR:n jälkeen myös tuo taulukko2.sarake2.

Edit: Ja hieman sievemmäksi saat tuota kyselyä seuraavasti (en nyt tässä muokkaustilassa näe enää tuota viestiäsi):

SELECT a.tieto1, a.tieto2, a.tieto3, b.tietoJokumuu FROM taulu1 a, taulu2 b WHERE a.jokutieto = b.jokumuutieto

Ja sitä rataa. Myös AS on hyödyllinen.

leftover [09.09.2004 20:57:32]

#

Suosittelen heti alkuun opettelemaan LEFT JOIN, joka pelastaa tässäkin tapauksessa:

SELECT taulukko1.sarake1, taulukko1.sarake2, taulukko1.sarake3
FROM taulukko1
LEFT JOIN taulukko2 ON (taulukko2.sarake1 = taulukko1.sarake4)
WHERE taulukko2.sarake2 = 6
OR taulukko2.sarake2 = 12;

Miksi sitten näin? Puretaan oma kyselysi osiin:
1. Kysely kerää WHERE-ehdossa taulukosta 1 ja 2 kaikki tietueet
2. Tämän jälkeen taulukko1 tietueista valitaan kaikki jotka täsmäävät johonkin taulukon2 x-tietueesta sarakkeeseen 1
3. Seuraavaksi taulukko2 tietueista valitaan ne, joissa sarake2 on 6
4. Lopuksi katsotaan onko mikä tahansa tietue 12 (== ei koska ei haeta yhtä kenttää)

Sitten ehdotukseni:
1. Aluksi lause hakee taulukon1 ja 2 tietueet joissa taulukko1.sarake4 = taulukko2.sarake1
2. Lopuksi WHERE-ehto raakkaa tietueista pois ne, joissa taulukko2.sarake2 ei ole 6 tai 12 (== poistaa myös ne tietueet, joissa liittämisehto ei toteutunut).

Oma kyselysi on STRAIGHT JOIN, jossa pyritään liittämään kaikki kaikkiin, onnistui tai ei. STRAIGHT JOIN toimii pääsääntöisesti vain kahden identtisen taulun tietojen liittämisessä.

Minun esittämässä tavassa käytetään LEFT JOIN, joka nimensä mukaisesti liittää vasemmalle. Eli aluksi tulee päätaulun tiedot, tämän jälkeen tulee LEFT JOIN taulusta relaatiotiedot (tai NULL jos relaatioehto ei täyty).

EDIT: Ja koska aivan selkeästi aiot toimia relaatioavaimilla, muista: Jokaiselle tietueelle uniikki-id (id MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT) ja relaatioavaimelle oma kenttä (toisentaulun_id MEDIUMINT UNSIGNED NOT NULL). Pysyy relaatiot paremmin kurissa.

2. Kannattaa myös harkita ylipäänsä nimeämistä. Jos kentät ovat sarake1, sarake2... et loppupeleissä muista mitä mikin tekee. Kun nimeät, mieti käyttötarkoitusta. Jos kentän nimi on kaytossa, ei ole mitään järkeä tunkea siihen muuta kuin boolean (0 tai 1) arvoja. Kenttänimellä kuvaus taas ei ole mitään järkeä, jos se nielisi liukulukuja.

3. Lopetetaan heti alkuun VARCHAR-käyttö (pl. erikoistilanteet kuten uniikkiavaimet). Optimointi kannattaa aina ( http://www.futureality.net/php/oppaat/1/ )

mika_jussi [10.09.2004 10:47:43]

#

Loistavaa, nyt sain sen toimimaan kuten halusin.
Kiitos!

Vastaus

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

Tietoa sivustosta