|
| SELECT * og count() Fra : Stig Sørensen |
Dato : 20-03-08 07:38 |
|
Hej gruppe.
Er kørt helt fast og har brug for hjælp.
mySQL.
SELECT * from phpbb_garage, phpbb_garage_makes,
phpbb_garage_guestbooks, punbb_users WHERE phpbb_garage.make_id =
phpbb_garage_makes.id_makes AND phpbb_garage_guestbooks.author_id =
punbb_users.id AND phpbb_garage_guestbooks.garage_id = phpbb_garage.id
LIMIT 10;
Ovenstående virker.
Hvad jeg gerne vil have talt er, hvor mange rækker
phpbb_garage_guestbooks.garage_id består af, HVOR
phpbb_garage_guestbooks.garage_id = phpbb_garage_guestbooks.garage_id
(altså samme værdi).
Men hvordan slår jeg count sammen med ovenstående SELECT?
Jeg har prøvet at tilføje "COUNT(*) from
phpbb_garage_guestbooks.garage_id WHERE
phpbb_garage_guestbooks.garage_id = phpbb_garage_guestbooks.garage_id
GROUP BY phpbb_garage_guestbooks.garage_id ORDER BY
phpbb_garage_guestbooks.garage_id DESC"
- både bagerst, først i SELECTEN osv. Intet virker.
Nogen der kan hjælpe mig? Hvis jeg ikke har forklaret mig godt nok, så
skriv endelig, så vil jeg forsøge påny.
På forhånd mange gange tak og god Påske.
Mvh
Stig Sørensen
| |
Martin (20-03-2008)
| Kommentar Fra : Martin |
Dato : 20-03-08 15:11 |
|
Stig Sørensen wrote:
> Hej gruppe.
>
> Er kørt helt fast og har brug for hjælp.
> mySQL.
>
>
> SELECT * from phpbb_garage, phpbb_garage_makes,
> phpbb_garage_guestbooks, punbb_users WHERE phpbb_garage.make_id =
> phpbb_garage_makes.id_makes AND phpbb_garage_guestbooks.author_id =
> punbb_users.id AND phpbb_garage_guestbooks.garage_id = phpbb_garage.id
> LIMIT 10;
>
>
> Ovenstående virker.
>
> Hvad jeg gerne vil have talt er, hvor mange rækker
> phpbb_garage_guestbooks.garage_id består af, HVOR
> phpbb_garage_guestbooks.garage_id = phpbb_garage_guestbooks.garage_id
> (altså samme værdi).
>
> Men hvordan slår jeg count sammen med ovenstående SELECT?
> Jeg har prøvet at tilføje "COUNT(*) from
COUNT(phpbb_garage_guestbooks.*)
> phpbb_garage_guestbooks.garage_id WHERE
> phpbb_garage_guestbooks.garage_id = phpbb_garage_guestbooks.garage_id
> GROUP BY phpbb_garage_guestbooks.garage_id ORDER BY
> phpbb_garage_guestbooks.garage_id DESC"
> - både bagerst, først i SELECTEN osv. Intet virker.
>
> Nogen der kan hjælpe mig? Hvis jeg ikke har forklaret mig godt nok, så
> skriv endelig, så vil jeg forsøge påny.
>
>
> På forhånd mange gange tak og god Påske.
>
> Mvh
> Stig Sørensen
| |
Stig Sørensen (20-03-2008)
| Kommentar Fra : Stig Sørensen |
Dato : 20-03-08 10:45 |
|
On 20 Mar., 15:11, Martin <mar...@aarhof.invalid> wrote:
> COUNT(phpbb_garage_guestbooks.*)
Du kunne ikke have brugt 10 sekunder mere og fortalt hvordan
ovenstående skal sættes sammen med SELECT sætningen?
Uanset hvordan jeg prøver at sætte COUNT ind giver det fejl.
"SELECT * from phpbb_garage, phpbb_garage_makes,
phpbb_garage_guestbooks, punbb_users WHERE phpbb_garage.make_id =
phpbb_garage_makes.id_makes AND phpbb_garage_guestbooks.author_id =
punbb_users.id AND phpbb_garage_guestbooks.garage_id =
phpbb_garage.id, COUNT(phpbb_garage_guestbooks.*) GROUP BY COUNT LIMIT
10"
?
| |
Stig Sørensen (20-03-2008)
| Kommentar Fra : Stig Sørensen |
Dato : 20-03-08 11:45 |
|
Ved rent gætteri ramte jeg rigtigt:
SELECT *, COUNT(phpbb_garage_guestbooks.garage_id) as tal from
phpbb_garage, phpbb_garage_makes, phpbb_garage_guestbooks, punbb_users
WHERE phpbb_garage.make_id = phpbb_garage_makes.id_makes AND
phpbb_garage_guestbooks.author_id = punbb_users.id AND
phpbb_garage_guestbooks.garage_id = phpbb_garage.id GROUP BY
phpbb_garage_guestbooks.garage_id ORDER BY tal DESC LIMIT 10
| |
Jens Gyldenkærne Cla~ (21-03-2008)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 21-03-08 12:34 |
|
Stig Sørensen skrev:
> Er kørt helt fast og har brug for hjælp.
> mySQL.
Jeg har opdaget at du fik løst problemet - men du får lige et par
generelle indspark alligevel.
> SELECT * from phpbb_garage, phpbb_garage_makes,
> phpbb_garage_guestbooks, punbb_users WHERE
> phpbb_garage.make_id phpbb_garage_makes.id_makes AND
> phpbb_garage_guestbooks.author_id punbb_users.id AND
> phpbb_garage_guestbooks.garage_id = phpbb_garage.id LIMIT 10;
Det er svært at læse en så lang sql-kode uden formatering. Et par
aliasser og evt. eksplicit joinangivelse kan gøre underværker:
SELECT *
FROM phpbb_garage g
INNER JOIN phpbb_garage_makes gm
ON g.make_id = gm.id_makes
INNER JOIN phpbb_garage_guestbooks gb
ON g.id = gb.garage_id
INNER JOIN punbb_users
ON gm.author_id = u.id AND
> Hvad jeg gerne vil have talt er, hvor mange rækker
> phpbb_garage_guestbooks.garage_id består af, HVOR
> phpbb_garage_guestbooks.garage_id =
> phpbb_garage_guestbooks.garage_id (altså samme værdi).
Ovenstående giver ikke mening. Jeg gætter på at du gerne vil lave
en gruppering der for hver garage (garage_id) viser hvor mange
poster der er tilknyttet i garage_guestbooks.
Den grundlæggende syntaks er her:
SELECT garage_id, COUNT(*)
FROM phpbb_garage_guestbooks
GROUP BY garage_id
> Men hvordan slår jeg count sammen med ovenstående SELECT?
> Jeg har prøvet at tilføje "COUNT(*) from
I grupperede forespørgsler skal alle felter i select-listen enten
være grupperet (medtaget i GROUP BY-linjen) eller aggregeret
(pakket ind i en aggregatfunktion som SUM, COUNT, AVG,...).
Derfor er SELECT *, COUNT(...) som udgangspunkt en dårlig ide. Hvis
man fx skrev grupperingsforespørgslen ovenfor med en * - som
følger:
SELECT *, COUNT(*)
FROM phpbb_garage_guestbooks
GROUP BY garage_id
- vil forespørgslen skulle levere data fra alle felter i tabellen.
Garage_id'et er nemt nok - da det er omfattet af grupperingen. Men
hvis der nu fx er et guestbook_id - der i sagens natur er unikt for
hver post, vil databasen ikke kunne vælge én værdi til postsættet,
og derfor er forespørgslen ikke veldefineret.
Nogle databasesystemer - bl.a. MySQL - vælger så at "hjælpe"
brugeren ved at gætte sig til hvad brugeren har ment - så vidt jeg
husker ved i praksis at tilføje de problematiske felter til GROUP
BY-udtrykket. Andre vil bare stoppe udførelsen og komme med en
fejl.
Hvis man skal bruge aggregerede og ikke-aggregerede oplysninger
sammen - og ikke bare vil lave et monsterstort grupperingsudtryk,
kan man fx bruge et join til en grupperet forespørgsel:
SELECT *
FROM phpbb_garage g
INNER JOIN
(SELECT garage_id, COUNT(*)
FROM phpbb_garage_guestbooks
GROUP BY garage_id) As gruppe
ON g.garage_id = gruppe.garage_id
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information
| |
Leif Neland (29-04-2008)
| Kommentar Fra : Leif Neland |
Dato : 29-04-08 11:20 |
|
"Jens Gyldenkærne Clausen" <jens@gyros.invalid> skrev i en meddelelse
news:Xns9A687FEB3C22Djcdmfdk@gyrosmod.dtext.news.tele.dk...
>
> I grupperede forespørgsler skal alle felter i select-listen enten
> være grupperet (medtaget i GROUP BY-linjen) eller aggregeret
> (pakket ind i en aggregatfunktion som SUM, COUNT, AVG,...).
>
> Derfor er SELECT *, COUNT(...) som udgangspunkt en dårlig ide. Hvis
> man fx skrev grupperingsforespørgslen ovenfor med en * - som
> følger:
>
> SELECT *, COUNT(*)
> FROM phpbb_garage_guestbooks
> GROUP BY garage_id
>
> - vil forespørgslen skulle levere data fra alle felter i tabellen.
> Garage_id'et er nemt nok - da det er omfattet af grupperingen. Men
> hvis der nu fx er et guestbook_id - der i sagens natur er unikt for
> hver post, vil databasen ikke kunne vælge én værdi til postsættet,
> og derfor er forespørgslen ikke veldefineret.
>
> Nogle databasesystemer - bl.a. MySQL - vælger så at "hjælpe"
> brugeren ved at gætte sig til hvad brugeren har ment - så vidt jeg
> husker ved i praksis at tilføje de problematiske felter til GROUP
> BY-udtrykket. Andre vil bare stoppe udførelsen og komme med en
> fejl.
Mysql tager blot værduerne fra en tilfældig række ud af de, der har den
samme group-by værdi.
Leif
| |
|
|