Ik wil de laatste 15 nieuwsberichten hebben (zonder dubbele) gesorteerd op datum vd laatste reactie. Dus 15 titels van nieuwsberichten met daarachter het aantal reacties. Op dit moment worden de berichten gesorteerd op de eerste reactie, wat dus de laatste zou moeten zijn.

Dit is de Query:


<?php function showReacties()
{
global $db;
$sql = 'SELECT com.datum, com.news_id, news.title, COUNT(com.news_id) AS numReactions
FROM ` news_comments` com, `news_news` news
WHERE com.news_id = news.id
GROUP BY com.news_id, news.title
ORDER BY com.datum DESC LIMIT 0,15';

$db->DbQuery( $sql );

echo "<table width='240' border='0' cellspacing='0' cellpadding='0'>\n";

if( $db->DbNumRows() > 0 )
while( $article = $db->DbNextRow() )
{
echo "<tr><td>";
echo "<p class='datumtijd'>" . datumnew($article['datum']) . "<a class='item' href=index.php?archive={$article['news_id']}#reageer'> | {$article['title']} ({$article['numReactions']})</a>";
echo "</td></tr>";
}
else
echo "Kon geen artikelen ophalen $db->DbError()";

echo "</table>\n";
}
?>

Dit is de structuur van de comments table:

CREATE TABLE `news_comments` (
`id` int(11) NOT NULL auto_increment,
`news_id` int(11) NOT NULL default '0',
`ip` varchar(15) NOT NULL default '',
`datum` timestamp NULL default CURRENT_TIMESTAMP,
`message` text NOT NULL,
`email` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Wie-o-wie biedt die helpende hand?
ORDER BY com.datum DESC

Maar daar even

ORDER BY com.datum ASC van
Dat heb ik al geprobeerd. Maar in dat geval krijg ik de allereerste berichten eerst, en dan nog selecteert 'ie per individueel bericht alsnog de eerst geposte comment.

Vreemd, hm?
Ik zou het anders aanpakken:

    SELECT distinct com.news_id, com.datum, news.title
    FROM news_comments AS com, news_news AS news
    WHERE com.news_id = news.id
    ORDER BY com.datum DESC
    LIMIT 15


edit: is nog niet de volledige query maar een opzetje om uit te proberen
<?php SELECT DISTINCT com.news_id, com.datum, new.title..." ?>

is hetzelfde als

<?php SELECT com.news_id, com.datum, new.title .. GROUP BY com.news_id, com.datum. new.title ?>

Dit heeft tot gevolg dat door die group by de rows die de laatste reactie bevatten eruit worden gefilterd. Hierdoor werkt ORDER BY (uiteraard) niet meer goed.
Ik vraag me af of het precies hetzelfde werkt. Ik heb net even lokaal getest en bij mij lijkt die ORDER BY prima te werken. Heb je hem al uitgetest in jouw situatie?
Query netjes uitschrijven wil nog wel eens helpen met het overizicht:
<?php
$sql = "
SELECT
com.datum,
com.news_id,
news.title,
COUNT(com.news_id) AS numReactions
FROM
news_comments AS com,
news_news AS news
WHERE
com.news_id = news.id
GROUP BY
com.news_id,
news.title
ORDER BY
com.datum DESC
LIMIT 0,15
";
?>

De sortering met DESC lijkt mij wel ok (om de 15 laatste resultaten te kunnen pakken), maar als je deze 15 resultaten oplopend (dus ASC) wilt sorteren, moet je met een subquery gaan werken.

Tip: Maak van die TIMESTAMP een DATETIME, is 999 van de 1000 x handiger. En die ene keer dat je echt een timestamp nodig hebt, kun je die aanmaken op basis van de DATETIME. MySQL heeft daar prachtige functies voor, zie hoofdstuk 12.5 van de handleiding.
Frank,

Ik heb geen idee wat je precies in gedachten had?

@Gregory: heb je de tips van Frank en mij uitgeprobeerd? En wat voor resultaten krijg je dan? Het praat een stuk makkelijker als je meldt wat er gebeurt als je onze voorbeelden uitprobeert.
@ Jan: Ja, ik heb alle voorbeelden uitgeprobeerd. Jouw voorbeeld werkte dus niet, zie mijn 3e post.

@ Frank: ik weet niet wat je precies bedoelt. Ik heb geen idee hoe ik een subquery maak.

Thx...
Gregory Arthur schreef op 12.06.2006 21:53
@ Jan: Ja, ik heb alle voorbeelden uitgeprobeerd. Jouw voorbeeld werkte dus niet, zie mijn 3e post.
Thx...

Ja, die had ik gelezen. Maar wat was precies het resultaat? Precies hetzelfde als bij je andere query?

Reageren