[MySQL] Update tracker query

Pagina: 1
Acties:

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

Topicstarter
Probleem: Query laat niet het gewenste resultaat zien

SQL:
1
2
3
4
5
6
7
SELECT comments.comment_date, posts.ID, posts.post_title
FROM wp_comments AS comments
INNER JOIN wp_posts AS posts ON posts.ID = comments.comment_post_ID
WHERE posts.post_date_gmt <= '2006-11-02 17:48:00'
GROUP BY posts.ID
ORDER BY comments.comment_date DESC
LIMIT 0 , 12


Bovenstaande query laat de laatste comments zien in de vorm van:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
comment_date             ID           post_title
2006-10-31 15:59:04     2852    Lista: Fiesta halloween en Shoko
2006-10-31 02:03:51     2850    Guestlist: Halloween party at Shoko
2006-10-27 16:35:45     966     St. Tropez celebra su primer aniversario!
2006-10-25 00:06:36     2402    Space Tardes
2006-10-24 23:26:09     1552    Feeling Casanova
2006-10-20 11:08:40     2358    SHOKO
2006-10-20 10:39:52     2272    Ribelino's
2006-10-19 21:40:54     1280    Catwalk
2006-10-19 21:37:44     1398    Discotheque
2006-10-17 19:23:26     2132    Pacha
2006-10-17 01:00:49     1086    Baja Beach Club
2006-10-17 00:58:55     2400    Space Barcelona


Er gaat echter wat fout. Ik mis een nieuwer resultaat.

Haal ik de group by clause weg uit de query, dan krijg ik netjes de laatste comments te zien.
SQL:
1
2
3
4
5
6
SELECT comments.comment_date, posts.ID, posts.post_title
FROM wp_comments AS comments
INNER JOIN wp_posts AS posts ON posts.ID = comments.comment_post_ID
WHERE posts.post_date_gmt <= '2006-11-02 17:48:00'
ORDER BY comments.comment_date DESC
LIMIT 0 , 12

Alleen krijg ik dan als resultaat alle laatste comments. Dat betekent dat als de laatste 2 comments bij dezelfde post horen, de update tracker 2 keer een link toont naar die post. Precies wat ik niet wil.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
comment_date               ID       post_title
2006-11-02 19:08:52     1996    Merci
2006-11-02 12:04:11     1996    Merci
2006-11-01 14:31:12     1996    Merci
2006-10-31 20:46:28     2850    Guestlist: Halloween party at Shoko
2006-10-31 20:26:33     2850    Guestlist: Halloween party at Shoko
2006-10-31 19:40:06     2852    Lista: Fiesta halloween en Shoko
2006-10-31 19:07:47     2852    Lista: Fiesta halloween en Shoko
2006-10-31 18:58:07     2852    Lista: Fiesta halloween en Shoko
2006-10-31 18:32:18     2852    Lista: Fiesta halloween en Shoko
2006-10-31 18:26:34     2852    Lista: Fiesta halloween en Shoko
2006-10-31 18:13:29     2852    Lista: Fiesta halloween en Shoko
2006-10-31 18:11:22     2852    Lista: Fiesta halloween en Shoko



De juiste uitkomst zou zijn

code:
1
2
3
4
5
6
7
8
9
10
11
12
2006-11-02 19:08:52     1996    Merci
2006-10-31 15:59:04     2852    Lista: Fiesta halloween en Shoko
2006-10-31 02:03:51     2850    Guestlist: Halloween party at Shoko
2006-10-27 16:35:45     966     St. Tropez celebra su primer aniversario!
2006-10-25 00:06:36     2402    Space Tardes
2006-10-24 23:26:09     1552    Feeling Casanova
2006-10-20 11:08:40     2358    SHOKO
2006-10-20 10:39:52     2272    Ribelino's
2006-10-19 21:40:54     1280    Catwalk
2006-10-19 21:37:44     1398    Discotheque
2006-10-17 19:23:26     2132    Pacha
2006-10-17 01:00:49     1086    Baja Beach Club


Kan iemand mij uitleggen wat er hier fout gaat?

Uitgevoerde stappen:

Got faq over group by (Programming FAQ - SQL) gechecked, gespeeld met max(comment_date) maar helaas allemaal zonder resultaat.

Verstand van Voip? Ik heb een leuke baan voor je!


Verwijderd

Je moet groeperen op ALLE velden uit je select die niet in een aggregate functie staat, staat ook wel in de FAQ. Dat de query wel wordt uitgevoerd, is omdat MySQL dit wel pakt.

Dus, zoiets als dit:

SQL:
1
2
3
4
5
6
7
SELECT MAX(comments.comment_date), posts.ID, posts.post_title
FROM wp_comments AS comments
INNER JOIN wp_posts AS posts ON posts.ID = comments.comment_post_ID
WHERE posts.post_date_gmt <= '2006-11-02 17:48:00'
GROUP BY posts.ID, posts.post_title
ORDER BY comments.comment_date DESC
LIMIT 0 , 12

  • megamuch
  • Registratie: Februari 2001
  • Laatst online: 08-12-2024

megamuch

Tring Tring!

Topicstarter
Verwijderd schreef op donderdag 02 november 2006 @ 21:08:
Je moet groeperen op ALLE velden uit je select die niet in een aggregate functie staat, staat ook wel in de FAQ. Dat de query wel wordt uitgevoerd, is omdat MySQL dit wel pakt.

Dus, zoiets als dit:

SQL:
1
2
3
4
5
6
7
SELECT MAX(comments.comment_date), posts.ID, posts.post_title
FROM wp_comments AS comments
INNER JOIN wp_posts AS posts ON posts.ID = comments.comment_post_ID
WHERE posts.post_date_gmt <= '2006-11-02 17:48:00'
GROUP BY posts.ID, posts.post_title
ORDER BY comments.comment_date DESC
LIMIT 0 , 12
Thanks voor je input. Ik heb in dat stuk in de FAQ gelezen, en precies jouw query uitgevoerd (en nog wat variaties in volgorde daarop, maar vanwege duidelijkheid niet in de TS geplaatst).

Ook dit levert niet het gewenste resultaat op. Als ik jouw query analyseer en vergelijk met het verhaal in de FAQ dan moet jouw query kloppen volgens mijn logica. Het tegendeel is echter waar.

Ik heb al gekeken of er verschil zit in de data tussen verschillende posts, maar ook daar kan ik geen verschillen ontdekken. Ik snap er geen hout meer van. :?

Hmmm misschien werkt max niet op een datetime field. Dat zou nog kunnen.

* megamuch gaat op onderzoek uit

Edit:

Oplossing gevonden:

SQL:
1
2
3
4
5
6
7
SELECT MAX(comments.comment_date) as mdt, posts.ID, posts.post_title
FROM wp_comments AS comments
INNER JOIN wp_posts AS posts ON posts.ID = comments.comment_post_ID
WHERE posts.post_date_gmt <= '2006-11-02 17:48:00'
GROUP BY posts.ID, posts.post_title
ORDER BY mdt DESC
LIMIT 0 , 12


De truc is om die max(comments.comments_date) een alias te geven en die alias te gebruiken in de order by clause.

Op het eerste gezicht lijkt het nu helemaal te kloppen.

[ Voor 16% gewijzigd door megamuch op 02-11-2006 21:37 ]

Verstand van Voip? Ik heb een leuke baan voor je!