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 10Mutta 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 10Mutta 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 10Mutta 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 summaEi 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.