Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL: Alikyselyiden mukaan järjestäminen

kayttaja-2791 [31.08.2006 14:49:19]

#

Eli minulla on kolme tietokantaa (havainnointitarkoituksessa tälläiset, ei vastaa oikeaa tilannetta):

Käyttäjät:
-----------------------
Id | Käyttäjänimi
-----------------------

Käyttäjien_autot:
-----------------------
käyttäjäId | autoMerkki
-----------------------

Käyttäjien_mopot:
-----------------------
käyttäjäId | mopoMerkki
-----------------------

Ja haluan hakea käyttäjät joilla on eniten mopoja sekä autoja. Itse hahmotin sitä hakua tällä tavalla:

SELECT
  Käyttäjänimi,
  Id,
  (SELECT COUNT(*) FROM Käyttäjien autot WHERE käyttäjäId = Id) AS automaara,
  (SELECT COUNT(*) FROM Käyttäjien_mopot WHERE käyttäjäId = Id) AS mopomaara
    FROM Käyttäjät
    ORDER BY automaara+mopomaara DESC LIMIT 10

Mutta tästä seuraa valitus:
Unknown column 'automaara' in 'order clause'

Okei, aliaksia ei välttämättä kannata käyttää ORDERissa:
http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html

Tosin ne kyllä toimivat, jopa oikein niin kauan kuin en suorita sielä laskutoimituksia.

Joten ajattelin sitten tehdä summasta oman aliaksen:

SELECT
  Käyttäjänimi,
  Id,
  (SELECT COUNT(*) FROM Käyttäjien autot WHERE käyttäjäId = Id) AS automaara,
  (SELECT COUNT(*) FROM Käyttäjien_mopot WHERE käyttäjäId = Id) AS mopomaara,
  automaara+mopomaara AS ajoneuvoSumma
    FROM Käyttäjät
    ORDER BY ajoneuvoSumma DESC LIMIT 10

Mutta ei sekään toimi, valittaa vain väärästä kolumnista edelleen:
Unknown column 'automaara' in 'field list'

Onnistuneeseen lopputulokseen pääsin kun tein alikyselyt kahteen kertaan:

SELECT
  Käyttäjänimi,
  Id,
  (SELECT COUNT(*) FROM Käyttäjien autot WHERE käyttäjäId = Id) AS automaara,
  (SELECT COUNT(*) FROM Käyttäjien_mopot WHERE käyttäjäId = Id) AS mopomaara,
  (SELECT COUNT(*) FROM Käyttäjien autot WHERE käyttäjäId = Id)
  +
  (SELECT COUNT(*) FROM Käyttäjän_mopot WHERE käyttäjäId = Id)
  AS ajoneuvoSumma
    FROM Käyttäjät
    ORDER BY ajoneuvoSumma DESC LIMIT 10

Mutta tämä menee jo erittäin rumaksi (ja turhien kyselyiden käytöksi, haluan paitsi järjestää ajoneuvosumman mukaan, niin myös hakea tiedot mopojen ja autojen määrästä). Mikä olisi oikea tapa toteuttaa kyseinen haku? Heittää alikyselyt kokonaan mäkeen?

Käytössä siis MySQL4 (uusin tietääkseni). Kiitos jo etukäteen kaikille jotka edes jaksavat lukea kysymyksen ajatuksen kanssa :)

Niko [31.08.2006 14:56:46]

#

En kyllä tiedä mutta onnistuiskohan:

Jos joinaisit noi kaiksi taulua ja sitten group by ja countilla määrä (en kokeillu mutta saattaa toimia)

kayttaja-2791 [31.08.2006 15:00:01]

#

Saattaisipa toimiakin. Kokeilaanpas. Kiitos ehdotuksesta.

Edit:
Ei toimi, mikäli nyt oikein tulkitsin. Joinasin (LEFT JOIN) mopot ja autot, ja grouppasin käyttäjänimen mukaan. Asetin COUNTeille alikset mopomaara ja automaara, ja sama ongelma on yhä. Valittaa siis tuntemattomasta kolumnista.

Niko [31.08.2006 15:24:30]

#

Voisit laittaa orderin count funktion mukaan.

kayttaja-2791 [31.08.2006 15:37:45]

#

Laitoin jo countin aliaksien mukaan. Count-funktion käyttö orderissa taas ei käsittääkseni ole sallittua, sillä se taitaa sekoittaa ryhmittämisen? No, kokeilin sitäkin, eikä se toiminut.

Olga [31.08.2006 19:19:14]

#

Seuraava voi olla jo valmiiksi kuollut ajatus, mutta toimisikohan derivered query? Menisi jotenkin tyyliin

SELECT automaara, mopomaara, (automaara + mopomaara) AS summa
FROM kayttajat
JOIN (SELECT COUNT(*) AS automaara
      FROM autot
      WHERE id = x) autohaku
JOIN (SELECT COUNT(*) AS mopomaara
      FROM mopot
      WHERE id = x) mopohaku
ORDER BY summa

Ei varmaan mene läpi ihan noin, mutta ehkä tuosta saa idean. Ihan simppeliä kyselyähän tuosta ei saa tekemälläkään kun haettavaa on useammasta taulusta ja vieläpä lukumäärää pitää laskea.

kayttaja-2791 [31.08.2006 19:22:12]

#

Pitääpä kokeilla. Ei siitä ihan yksinkertaista saa, mutta käytän oikeassa sovelluksessa vähän monimutkaisempaa algoritmiä kuin summaamista, ja tällä hetkellä siinä pitää tehdä nuo samat alikyselyt neljään kertaan... Ei se sinänsä ole missään nopeuskriittisessä toiminossa, mutta kiinnostaisi kovasti tietää mistä homma kiikastaa, ja miten se pitäisi tehdä oikein.

Vastaus

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

Tietoa sivustosta