[mysql] "Last reply tracker" query

Pagina: 1
Acties:

  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Voor de nieuws site waar ik mee bezig ben moet ik een lastreply tracker maken
Nou dat leek me simpel (zal het ook vast zijn hoor :P) maar ik kom er niet goed uit:
Ik ben eik ook niet zn held in querys

Ik heb deze tabellen:

Reacties:
code:
1
2
3
4
5
+----+---------+---------+------------------+------------+--------+
| id | id_user | id_item | text      | datum    | status |
+----+---------+---------+------------------+------------+--------+
|  1 |   1 |     2 | It wasn't me. :P | 1005082439 |    1 |
+----+---------+---------+------------------+------------+--------+

Nieuws:
code:
1
2
3
4
5
+------+---------+------------+---------+--------------+-----------------+---------+--------+-----------+----------+
| id   | user_id | titel    | bericht | samenvatting | bron_url   | plaatje | status | datum    | bron     |
+------+---------+------------+---------+--------------+-----------------+---------+--------+------------+----------+
| 1151 |    11 | Test titel |      |          | www.happyfun.nl |      |    1 | 1005082093 | happyfun |
+------+---------+------------+---------+--------------+-----------------+---------+--------+-----------+----------+

Als ik deze query gebruik:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
    nieuws.id,
    max(reacties.datum),
nieuws.titel,
    users.nickname
FROM 
    reacties, 
    nieuws ,
    users
where 
    nieuws.id = reacties.id_item
AND
    reacties.id_user = users.id
group by
    nieuws.id,
    nieuws.titel
Order by
    reacties.Datum DESC 
limit 5

Dan krijg ik dit
code:
1
2
3
4
5
6
7
8
9
+------+---------------------+----------------------------------------------------+----------+
| id   | max(reacties.datum) | titel                                         |nickname|
+------+---------------------+----------------------------------------------------+----------+
| 1150 |        1017356405 | Verjaardag van 9 miljoen euro            | razor-x  |
| 1149 |        1016527849 | Duitser schrijft eerste symfonie ...        | razor-x  |
| 1144 |        1016467679 | Tweetal speelde 'flitspaaltje'              |Heineken|
| 1148 |        1016465715 | Conducteurs NS mishandelen reiziger       | Silly    |
| 1146 |        1016460927 | Chris en J. LO in blije verwachting          | Silly     |
+------+---------------------+----------------------------------------------------+----------+

Maar dit klopt niet :(

Want als ik dan deze query uitvoer:
code:
1
select max(datum) from reacties limit 1

krijg ik dit terug
code:
1
2
3
4
5
+------------+
| max(datum) |
+------------+
| 1017392069 |
+------------+

Wat dus de laatste reactie is, maar die staat niet in die query daarboven?

Dat had ik dus als eerste geprobeert :)

Toen heb ik deze query gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
    nieuws.id,
    nieuws.titel,
    max(reacties.datum),
    users.nickname
FROM 
    reacties, 
    nieuws ,
    users
where 
    nieuws.id = reacties.id_item
AND
    reacties.id_user = users.id
group by
    nieuws.id,
    nieuws.titel,
    reacties.datum
Order by
    reacties.Datum DESC 
limit 5

Die werkt wel goed! :
code:
1
2
3
4
5
6
7
8
9
+------+-------------------------------+---------------------+-----------+
| id   | titel               | max(reacties.datum) | nickname  |
+------+-------------------------------+---------------------+-----------+
|    1 | J-Lo heeft siliconenbillen    |        1017392069 | razor-x   |
| 1145 | Twee bejaarden expres geramd  |        1017356503 | razor-x   |
| 1150 | Verjaardag van 9 miljoen euro |        1017356405 | razor-x   |
| 1150 | Verjaardag van 9 miljoen euro |        1016636280 | razor-x   |
| 1150 | Verjaardag van 9 miljoen euro |        1016574145 | Mr-FaTMeN |
+------+-------------------------------+---------------------+-----------+

Op 1 ding na nu krijg ik dubbele titels in mn tracker :(

Iemand een idee hoe ik mijn query moet maken zodat hij wel goed werkt? :)
Ik kom er niet uit :(

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

is having niet een id?
code:
1
2
3
4
5
group by
     nieuws.id,
     nieuws.titel
having 
     bla = max(datum)

moet je alleen nog die having bepalen

[edit]
having uitleg (correct me if i'm wrong ;) )
in een having mag je van een group een voorwaarde met een functie zoals max()/min()/avg() stellen terwijl je die normaal allleen mag selecteren (en dus ook niet achter een where zetten)
zo zou je dus je group by al de goede gegevens kunnen laten bevatten en dan de rest erover gooien

Doet iets met Cloud (MS/IBM)


  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
    nieuws.id,
    max(reacties.datum),
nieuws.titel,
    users.nickname
FROM
    reacties,
    nieuws ,
    users
where
    nieuws.id = reacties.id_item
AND
    reacties.id_user = users.id
group by
    nieuws.id,
    nieuws.titel
having
    max(reacties.datum)
Order by
    reacties.Datum DESC 
limit 5

Deze geeft geen results
ik heb eigelijk dan geen idee hoe ik die having anders moet uitvoeren?

edit:
en dit kan toch eigelijk ook niet werken?
want having is een voorwaarde(toch?) , en als ik dan de voorwaarde max() gebruik.. dat is er altijd maar 1tje lijkt me?

Ik wil gewoon de laatste 5 reacties op een nieuws bericht, zonder dubbele titels

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

De eerste query die je post zit er het dichtste bij (denk ik)

Maak van die max eens:

max(reaction.datum) as lastpost


en dan onderin

ORDER BY lastpost DESC

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Birk
  • Registratie: Maart 2002
  • Laatst online: 15-02-2019
Op vrijdag 29 maart 2002 11:12 schreef razor-x het volgende:
code:
1
...

...

Ik wil gewoon de laatste 5 reacties op een nieuws bericht, zonder dubbele titels
Hmmm, In je query vraag je om de laatste news items, of zie ik het verkeerd...
Hoe wil je het hebben, net zoals op FoK...

Nieuws Item
Laatste 5 reacties...

edit:
Hmm sorry las niet goed, i get the point...

Dyslexie | Linux | MoZilla | OpenOffice


  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Janoz je bent geweldig :*

Maar ik zie het verschil eigelijk niet echt?
want je zegt dat lastpost , reacties.datum is?
dan zijn ze dus het zelfde? :? dan snap ik het verschil nog niet :)
Ik begrijp het wel , maar ik snap het nog niet

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-09 20:58

Janoz

Moderator Devschuur®

!litemod

Op vrijdag 29 maart 2002 11:22 schreef razor-x het volgende:
Janoz je bent geweldig :*

Maar ik zie het verschil eigelijk niet echt?
want je zegt dat lastpost , reacties.datum is?
dan zijn ze dus het zelfde? :? dan snap ik het verschil nog niet :)
Ik begrijp het wel , maar ik snap het nog niet
In je select gebruik je MAX(datum) terwijl je gaat sorteren op datum dat is niet hetzelfde. Deze hoefen namelijk niet dezelfde te zijn. Als je je limit had weggelaten had je het mischien kunnen zien.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Op vrijdag 29 maart 2002 11:37 schreef Janoz het volgende:

[..]

In je select gebruik je MAX(datum) terwijl je gaat sorteren op datum dat is niet hetzelfde. Deze hoefen namelijk niet dezelfde te zijn. Als je je limit had weggelaten had je het mischien kunnen zien.
Ja ik zie het nu ook ja!
die kunnen idd verschillen , bedankt iig :)

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Op vrijdag 29 maart 2002 10:49 schreef razor-x het volgende:
Als ik deze query gebruik:
[..]
Dan krijg ik dit ...
Ik vind deze query sowieso een beetje warrig, ik hou zelf meer van JOIN m.b.v. LEFT JOINS e.d. Daarnaast zou ikzelf nog wat andere dingen aanpassen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    nieuws.id,
    max(reacties.datum) AS 'lastpost',
    nieuws.titel,
    users.nickname
FROM 
    reacties
    LEFT JOIN nieuws
        ON nieuws.id = reacties.id_item
    LEFT JOIN users
        ON reacties.id_user = users.id
GROUP BY
    reacties.id_item
ORDER BY
    lastpost DESC 
LIMIT 5

Zo zou ik hem zelf maken. (Ik weet niet zeker of hij werkt)

  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Op vrijdag 29 maart 2002 11:45 schreef elnino het volgende:

[..]

Ik vind deze query sowieso een beetje warrig, ik hou zelf meer van JOIN m.b.v. LEFT JOINS e.d. Daarnaast zou ikzelf nog wat andere dingen aanpassen:
code:
1
..

Zo zou ik hem zelf maken. (Ik weet niet zeker of hij werkt)
Ik zal eens kijken welke sneller is, want de query die ik nu heb ik behoorlijk traag

edit:
code:
1
5 rows in set (0.08 sec)

en
code:
1
5 rows in set (0.08 sec)

even snel dus? (of weinig verschil)

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Op vrijdag 29 maart 2002 11:49 schreef razor-x het volgende:
even snel dus? (of weinig verschil)
JOIN's schijnen soms iets sneller te zijn, heb ik begrepen, maar ik vind JOIN's persoonlijk gewoon veel netter.
code:
1
2
3
4
5
6
7
8
9
10
SELECT
    *
FROM
    msg,
    topic,
    user
WHERE
    msg.user_id = user.user_id
AND
    msg.topic_id = topic.topic_id

Vind ik vele malen minder mooi dan:
code:
1
2
3
4
5
6
7
8
SELECT
    *
FROM
    msg
    LEFT JOIN topic
      ON msg.topic_id = topic.topic_id
    LEFT JOIN user
      ON msg.user_id = user.user_id

Bovendien wordt de WHERE-clausule bij de laatste niet gebruikt... Maar wat je beter vindt, hangt uiteraard af van je voorkeur.
Pagina: 1