Laatste reactie en aantal reacties in 1 query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Jan Horden

Jan Horden

30/01/2012 19:58:13
Quote Anchor link
Hey ik zit met het volgende probleem:
Ik wil in een tabel het aantal reacties weergeven + de laatste reactie uit de tabel 'reacties'. Dit is natuurlijk niet zo'n probleem alleen wil ik ook het onderwerp uit de tabel 'onderwerp' weergeven. Mijn query ziet er nu als volgt uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT onderwerp.id, onderwerp.onderwerp, COUNT( reactie.id ) AS aantal, reactie.auteur AS re_auteur
FROM onderwerp, reactie
WHERE onderwerp.id = reactie.ond_id
AND reactie.id IN (SELECT MAX(id) FROM reactie WHERE ond_id = 3)
GROUP BY onderwerp.id
ORDER BY onderwerp.id DESC

Het probleem zit hem nu in het feit dat door de AND statement waar de laatste reactie wordt opgevraagd er altijd maar 1 resultaat wordt weergegeven en de COUNT(reactie.id) dus ook altijd 1 opleverd. Ik wil echter alle reacties uit de tabel hebben.

Is dit te realiseren in 1 query en hoe?
Zo niet hoe zorg ik dan dat het resultaat toch in 1 tabel wordt weergegeven m.b.v. een while($rij = mysql_fetch_array($result)) lus?
Gewijzigd op 30/01/2012 20:02:07 door Jan Horden
 
PHP hulp

PHP hulp

23/11/2024 11:44:47
 
Jeroen VD

Jeroen VD

30/01/2012 20:00:20
Quote Anchor link
geeft hij een error?


Toevoeging op 30/01/2012 20:01:22:

maar waarom zet je het onderwerp niet gewoon bij elke reactie? aangenomen dat elke reactie een onderwerp heeft

in dezelfde tabel bedoel ik dan
Gewijzigd op 30/01/2012 20:01:54 door Jeroen VD
 
Jan Horden

Jan Horden

30/01/2012 20:01:49
Quote Anchor link
nope geen error maar het resultaat van de COUNT() is dus altijd 1...
 
Aad B

Aad B

30/01/2012 20:08:40
Quote Anchor link
De query zal een error geven maar die zie je waarschijnlijk niet. Je group by clausule is niet compleet.
Edit:
Cause: The GROUP BY clause does not contain all the expressions in the SELECT clause. SELECT expressions that are not included in a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, must be listed in the GROUP BY clause.
Action: Include in the GROUP BY clause all SELECT expressions that are not group function arguments.
Gewijzigd op 30/01/2012 20:11:41 door Aad B
 
Jeroen VD

Jeroen VD

30/01/2012 20:09:41
Quote Anchor link
ik zou zeggen: maak er 1 tabel van, dan kun je gewoon de reactie opvragen die je wilt, en heb je gelijk alles wat er bij hoort
 
Aad B

Aad B

30/01/2012 20:13:06
Quote Anchor link
Jeroen vd op 30/01/2012 20:09:41:
ik zou zeggen: maak er 1 tabel van, dan kun je gewoon de reactie opvragen die je wilt, en heb je gelijk alles wat er bij hoort
Dit is onzin, een soort van eromheen werken maar de group by blijft ondanks deze onzin tip toch fout gaan.
 
Jan Horden

Jan Horden

30/01/2012 20:14:09
Quote Anchor link
1 tabel ervan maken is nu niet echt een goede vorm van normaliseren als je het mij vraagt omdat dan bij elke reactie het onderwerp erbij staat + de rest van de data die in die tabel staat.

@Aad B: Waarom is mijn group by clausule niet compleet? Wat mist er?
 
- SanThe -

- SanThe -

30/01/2012 20:18:40
Quote Anchor link
Dit: SELECT MAX(id) kan toch maar één record opleveren?
 
Jan Horden

Jan Horden

30/01/2012 20:21:14
Quote Anchor link
Jan Horden op 30/01/2012 19:58:13:
Het probleem zit hem nu in het feit dat door de AND statement waar de laatste reactie wordt opgevraagd er altijd maar 1 resultaat wordt weergegeven en de COUNT(reactie.id) dus ook altijd 1 opleverd. Ik wil echter alle reacties uit de tabel hebben.


Ja dat zeg ik... daardoor levert die COUNT dus ook altijd 1 als resultaat op. Hoe krijg ik toch alle reacties in deze query te zien + de laatste reactie of is dit niet mogelijk?
 
Aad B

Aad B

30/01/2012 20:21:32
Quote Anchor link
- SanThe - op 30/01/2012 20:18:40:
Dit: SELECT MAX(id) kan toch maar één record opleveren?
Alleen wannneer id uniek is in de reactie tabel en dat wordt hier nergens gesteld. Je doet dus een aanname.



Toevoeging op 30/01/2012 20:22:51:

Jan Horden op 30/01/2012 20:14:09:
@Aad B: Waarom is mijn group by clausule niet compleet? Wat mist er?
En wel hierom: The GROUP BY clause does not contain ALL the expressions in the SELECT clause.
 
Jan Horden

Jan Horden

30/01/2012 20:24:51
Quote Anchor link
Ja id is inderdaad een unieke waarde dus de aanname is correct
 
Erwin H

Erwin H

30/01/2012 20:36:42
Quote Anchor link
Aad B op 30/01/2012 20:21:32:
- SanThe - op 30/01/2012 20:18:40:
Dit: SELECT MAX(id) kan toch maar één record opleveren?
Alleen wannneer id uniek is in de reactie tabel en dat wordt hier nergens gesteld. Je doet dus een aanname.

Geef dan aub eens een voorbeeld van een tabel waarin deze query meer dan 1 record oplevert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT MAX(id) FROM reactie WHERE ond_id = 3
 
Aad B

Aad B

30/01/2012 20:41:09
Quote Anchor link
Erwin H op 30/01/2012 20:36:42:
Aad B op 30/01/2012 20:21:32:
- SanThe - op 30/01/2012 20:18:40:
Dit: SELECT MAX(id) kan toch maar één record opleveren?
Alleen wannneer id uniek is in de reactie tabel en dat wordt hier nergens gesteld. Je doet dus een aanname.

Geef dan aub eens een voorbeeld van een tabel waarin deze query meer dan 1 record oplevert:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT MAX(id) FROM reactie WHERE ond_id = 3
Excuus, te snel gereageerd, levert inderdaad maar 1 record op!
 
Jan Horden

Jan Horden

30/01/2012 20:42:10
Quote Anchor link
Ben ik met je eens en ik stel elke hulp op prijs maar we dwalen af. Is het mogelijk de laatste reactie en het totaal aantal reacties in 1 querie te krijgen? Zo niet hoe krijg ik dan 2 query's in 1 tabel d.m.v een while lus?

@Aad B: je zal gelijk hebben met je GROUB BY maar dit lost het probleem niet op...
 
Aad B

Aad B

30/01/2012 21:51:06
Quote Anchor link
Ga het niet in php processen, de meest gemaakte bagger in php is allerlei data ophalen uit MySQL en dat processen in array's in php :(
In een andere SQL database los ik dat op met een inline view, volgens mij kan MySQL dat ook:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT onderwerp.id,
       onderwerp.onderwerp,
       reactie.auteur,
       cnt.aantal
 FROM  onderwerp,
       reactie,
      (select COUNT( reactie.id ) as aantal from reactie) cnt
WHERE onderwerp.id = reactie.ond_id
  AND reactie.id IN (SELECT MAX(id) FROM reactie WHERE ond_id = 3)
ORDER BY onderwerp.id DESC
 
Jan Horden

Jan Horden

30/01/2012 22:10:17
Quote Anchor link
hmm dit levert iig een aantal op wat groter is dan 1 maar dit geeft het totaal aantal reacties weer van alle onderewerpen en niet per onderwerp. Ondanks dat ik je query niet begrijp (die 2de SELECT tussen FROM en WHERE) heb ik hem aangepast zodat het nu per onderwerp wordt weergegeven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT onderwerp.id, onderwerp.onderwerp, reactie.auteur, cnt.aantal
FROM onderwerp, reactie, (

SELECT COUNT( reactie.id ) AS aantal
FROM reactie
WHERE ond_id =3
)cnt
WHERE onderwerp.id = reactie.ond_id
AND reactie.id
IN (

SELECT MAX( id )
FROM reactie
WHERE ond_id =3
)
ORDER BY onderwerp.id DESC


Bedankt!
p.s. ik zal me is verdiepen in inline view...
 
Aad B

Aad B

30/01/2012 22:15:31
Quote Anchor link
Het lijkt mij dat dit simpeler kan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT onderwerp.id,
       onderwerp.onderwerp,
       reactie.auteur,
       cnt.aantal
 FROM  onderwerp,
       reactie,
      (select COUNT( reactie.id ) as aantal from reactie) cnt
WHERE onderwerp.id = reactie.ond_id
  AND reactie.id IN (SELECT MAX(id) FROM reactie WHERE ond_id = 3)
  AND reactie.ond_id =3
ORDER BY onderwerp.id DESC
LIMIT 1
Gewijzigd op 30/01/2012 22:17:02 door Aad B
 
Jan Horden

Jan Horden

30/01/2012 22:18:16
Quote Anchor link
blijkbaar niet want dit geeft toch nog het totaal aantal reacties weer.
 
Aad B

Aad B

30/01/2012 22:20:38
Quote Anchor link
LIMIT moet dan wellicht zijn: LIMIT 1,1
Edit:

Ben niet zo thuis in LIMIT, mijn database kent dit niet.
Gewijzigd op 30/01/2012 22:22:22 door Aad B
 
Jan Horden

Jan Horden

30/01/2012 22:37:26
Quote Anchor link
LIMIT 1,1 geeft geen resultaten terug. Maar zoals ik het opgelost heb is het toch ook prima?
 
Aad B

Aad B

30/01/2012 22:38:14
Quote Anchor link
Jan Horden op 30/01/2012 22:37:26:
LIMIT 1,1 geeft geen resultaten terug. Maar zoals ik het opgelost heb is het toch ook prima?
Ja, is SQL technisch een prima oplossing.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.