Korte SQL vraag:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
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
Gebruik de max functie op de timestamp met een group by.
Nee, snap niet wat je bedoeld.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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
bumpo de olifant
GROUP BY id
en
MIN(UNIX_STAMP())
zijn
probleem opgelost.
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
toby hinloopen schreef op 31.05.2009 13:22:
Moest
GROUP BY id
en
MIN(UNIX_STAMP())
zijn
probleem opgelost.
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.
Boaz schreef op 31.05.2009 13:27:
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.toby hinloopen schreef op 31.05.2009 13:22:
Moest
GROUP BY id
en
MIN(UNIX_STAMP())
zijn
probleem opgelost.
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.
Wat bedoel je precies? Kan een topic-titel "verkeerd" teruggegeven worden?
Wat is dan de juiste query? De meest simpele low-load query?
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:
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?
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:
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?
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:
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)
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
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>';
}
?>
$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)
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
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>';
}
?>
$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.