Korte SQL vraag:

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Toby hinloopen

toby hinloopen

30/05/2009 21:03:00
Quote Anchor link
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
SELECT
    topic.id AS id,
    UNIX_TIMESTAMP(post.time) AS time,
    topic.title AS title
FROM
    forum_topics AS topic
LEFT JOIN
    forum_posts AS post
ON
    topic.id = post.topic
ORDER BY
    post.time ASC
LIMIT
    0,10



Deze query heb ik nu.

In de ene tabel staan de posts en in de andere tabel staan de topics. De aanmaaktijd van een topic wordt bepaald door de 1e posts in de posts-tabel.

In de posts-tabel staat uiteraard een kolom met "topic-id".


Wat er nu gebeurt:
Hij haalt een lijstje op met posts en bepaald van ieder bericht de topic-titel. Ik krijg dus het topic-id, tijd en topic-titel van het laatste bericht te zien.

Dat wil ik echter niet; Ik wil een lijstje met "nieuwste topics".
Hij moet maar 1 resultaat per topic geven en deze ordenen op basis van de timestamp van het oudste bericht in dat topic.

Hoe doe ik dat in 1 simpele query?

Heb al DISTINCT geprobeerd, maar het heeft geen effect.
Gewijzigd op 01/01/1970 01:00:00 door Toby hinloopen
 
PHP hulp

PHP hulp

14/11/2024 04:01:29
 
Yorick17

yorick17

30/05/2009 21:12:00
Quote Anchor link
Gebruik de max functie op de timestamp met een group by.
 
Toby hinloopen

toby hinloopen

30/05/2009 21:21:00
Quote Anchor link
ff kijken

Nee, snap niet wat je bedoeld.

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
        topic.id AS id,
        UNIX_TIMESTAMP(post.time) AS time,
        topic.title AS title
    FROM
        forum_topics AS topic
    LEFT JOIN
        forum_posts AS post
    ON
        topic.id = post.topic
    GROUP BY
        MAX(time)
    ORDER BY
        time ASC
    LIMIT
        0,10

= ERROR

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
        topic.id AS id,
        UNIX_TIMESTAMP(post.time) AS time,
        topic.title AS title
    FROM
        forum_topics AS topic
    LEFT JOIN
        forum_posts AS post
    ON
        topic.id = post.topic
    GROUP BY
        time
    ORDER BY
        time ASC
    LIMIT
        0,10

geen effect

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
        topic.id AS id,
        MAX(UNIX_TIMESTAMP(post.time)) AS time,
        topic.title AS title
    FROM
        forum_topics AS topic
    LEFT JOIN
        forum_posts AS post
    ON
        topic.id = post.topic
    GROUP BY
        time
    ORDER BY
        time ASC
    LIMIT
        0,10

Geen effect
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 
Toby hinloopen

toby hinloopen

30/05/2009 23:53:00
Quote Anchor link
bumpo de olifant
 
Toby hinloopen

toby hinloopen

31/05/2009 13:22:00
Quote Anchor link
Moest
GROUP BY id

en
MIN(UNIX_STAMP())

zijn

probleem opgelost.
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 
Bo az

Bo az

31/05/2009 13:27:00
Quote Anchor link
toby hinloopen schreef op 31.05.2009 13:22:
Moest
GROUP BY id

en
MIN(UNIX_STAMP())

zijn

probleem opgelost.


Let even op dat je alle kolommen die niet in een aggregate functie voorkomen in de group by opneemt, in het voorbeeld dus ook het titel veld.
 
Toby hinloopen

toby hinloopen

31/05/2009 14:28:00
Quote Anchor link
Boaz schreef op 31.05.2009 13:27:
toby hinloopen schreef op 31.05.2009 13:22:
Moest
GROUP BY id

en
MIN(UNIX_STAMP())

zijn

probleem opgelost.


Let even op dat je alle kolommen die niet in een aggregate functie voorkomen in de group by opneemt, in het voorbeeld dus ook het titel veld.
Die uitleg wordt me iets te ingewikkeld.
Wat bedoel je precies? Kan een topic-titel "verkeerd" teruggegeven worden?

Wat is dan de juiste query? De meest simpele low-load query?
 
Bo az

Bo az

31/05/2009 14:59:00
Quote Anchor link
Zoveel bijzonders bedoel ik niet.

Je hebt nu een query zeg je, in die query gebruik je in de select de MIN functie en je hebt het veld 'id' in de GROUP BY. In de voorbeelden die je gaf vraag je ook nog de kolom 'topic.title' op, ik neem aan dat je dat nog steeds doet, je doet dus iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
id, MIN(...), title,
FROM
tabel
...
GROUP BY
id
...


Hoe wel mysql op een dergelijke query geen fout melding geeft, is deze niet juist, je moet in dit geval behalve id ook title in de group by zetten.

Dit is overigens een aanname van mij, misschien heb je het al wel goed...

Ik hoop dat het zo duidelijk is?
 
Toby hinloopen

toby hinloopen

31/05/2009 18:58:00
Quote Anchor link
Boaz schreef op 31.05.2009 14:59:
Zoveel bijzonders bedoel ik niet.

Je hebt nu een query zeg je, in die query gebruik je in de select de MIN functie en je hebt het veld 'id' in de GROUP BY. In de voorbeelden die je gaf vraag je ook nog de kolom 'topic.title' op, ik neem aan dat je dat nog steeds doet, je doet dus iets als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
id, MIN(...), title,
FROM
tabel
...
GROUP BY
id
...


Hoe wel mysql op een dergelijke query geen fout melding geeft, is deze niet juist, je moet in dit geval behalve id ook title in de group by zetten.

Dit is overigens een aanname van mij, misschien heb je het al wel goed...

Ik hoop dat het zo duidelijk is?

Maar er zijn dubbele titels mogelijk. De id's zijn altijd uniek, de titels niet. Je zou 2 topics met een identieke titel moeten kunnen aanmaken en deze moeten ook allebei zichtbaar zijn.

Heb nu:
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
17
18
19
20
21
22
23
24
25
26
<?php
    
    $topics
= sql::query_result_auto('
    SELECT
        topic.id AS id,
        MIN(UNIX_TIMESTAMP(post.time)) AS time,
        topic.title AS title
    FROM
        forum_topics AS topic
    RIGHT JOIN
        forum_posts AS post
    ON
        topic.id = post.topic
    GROUP BY
        id
    ORDER BY
        time DESC
    LIMIT
        0,10
    '
);
    
    foreach($topics as $topic) {
        echo '<li>'.misctime($topic['time']).' <a href="topic/'.$topic['id'].'-'.seo($topic['title']).'.html">'.html($topic['title']).'</a></li>';
    }

    
    ?>


EN

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
17
18
19
20
21
22
23
24
25
26
<?php
    
    $topics
= sql::query_result_auto('
    SELECT
        topic.id AS id,
        MAX(UNIX_TIMESTAMP(post.time)) AS time,
        topic.title AS title
    FROM
        forum_topics AS topic
    RIGHT JOIN
        forum_posts AS post
    ON
        topic.id = post.topic
    GROUP BY
        id
    ORDER BY
        time DESC
    LIMIT
        0,10
    '
);
    
    foreach($topics as $topic) {
        echo '<li>'.misctime($topic['time']).' <a href="topic/'.$topic['id'].'-'.seo($topic['title']).'.html">'.html($topic['title']).'</a></li>';
    }

    
    ?>


1e is voor "Nieuwste Topics" en 2e is voor "Laatste Reacties". In beide gevallen mag ie niet meerdere resultaten laten zien van hetzelfde topic. 2 topics met dezelfde titel zijn echter niet "hetzelfde". Het ID is anders en de berichten die erin zitten zijn gekoppeld via het topic-id en niet via de titel.

De Query lijkt verder ook goed te werken.
 



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.