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 :)
En kyllä tiedä mutta onnistuiskohan:
Jos joinaisit noi kaiksi taulua ja sitten group by ja countilla määrä (en kokeillu mutta saattaa toimia)
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.
Voisit laittaa orderin count funktion mukaan.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.