帮助在php中对来自数据库(JOIN?)的结果进行排序
我升级了一点我的论坛,想改变主题的列表方式 我的主题存储在此表中:帮助在php中对来自数据库(JOIN?)的结果进行排序,php,sorting,left-join,Php,Sorting,Left Join,我升级了一点我的论坛,想改变主题的列表方式 我的主题存储在此表中: CREATE TABLE `forum_emner` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `type_forum` CHAR(9) NOT NULL, `gjengid` INT(10) UNSIGNED NULL DEFAULT '0', `sticky` TINYINT(1) UNSIGNED NULL DEFAULT '0',
CREATE TABLE `forum_emner` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`type_forum` CHAR(9) NOT NULL,
`gjengid` INT(10) UNSIGNED NULL DEFAULT '0',
`sticky` TINYINT(1) UNSIGNED NULL DEFAULT '0',
`emne` VARCHAR(255) NOT NULL,
`innlegg` TEXT NOT NULL,
`brukerid_starter` MEDIUMINT(8) UNSIGNED NOT NULL,
`startet_dato` INT(10) UNSIGNED NOT NULL,
`antall_lest` INT(10) UNSIGNED NULL DEFAULT '0',
`antall_svar` INT(10) UNSIGNED NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `type_forum` (`type_forum`),
INDEX `gjengid` (`gjengid`),
INDEX `sticky` (`sticky`),
INDEX `brukerid_starter` (`brukerid_starter`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
主题的答案存储在forum\u emner表中的此表emneid equals id中:
CREATE TABLE `forum_svar` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`emneid` INT(10) UNSIGNED NOT NULL,
`brukerid_av` MEDIUMINT(8) UNSIGNED NOT NULL,
`innlegg` TEXT NOT NULL,
`dato` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
INDEX `emneid` (`emneid`),
INDEX `brukerid_av` (`brukerid_av`)
)
COLLATE='latin1_swedish_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
dato是用php发布答案的时间
我想要的是:我想在论坛的dato_svar中对字段后的主题进行排序。最新答案的主题位于顶部,依此类推。但是,如果一个主题是在最热门的主题最后一个答案之后创建的,那么这个主题应该位于论坛实际运作方式的顶部
我自己也试过了,但效果不理想
SELECT *, `forum_emner`.id AS UnikTradID FROM `forum_emner`
LEFT JOIN `forum_svar` ON (`forum_emner`.id = `forum_svar`.emneid)
WHERE `forum_emner`.type_forum = :type AND `forum_emner`.sticky = 0
ORDER BY `forum_svar`.dato DESC LIMIT :p1, :p2
有什么帮助吗 旁注:您应该像我下面一样使用,以使查询看起来更可读。 您不应该将MySQL字段名保存在英语以外的其他语言中。如果你雇用一个不会说你的语言的人怎么办 首先要做的是获取最新的线程ID。 我们可以通过这样的查询来实现这一点:
SELECT MAX(fs.id) AS LastThreadId FROM forum_svar AS fs GROUP BY fs.emneid ORDER BY LastThreadId
现在我们需要将这个结果集与线程连接起来,以获得完整的线程信息。
我们这样做,将第一个查询作为子查询放在这里:
SELECT fs.* FROM forum_svar AS fs LEFT JOIN (SELECT MAX(fs.id) AS LastThreadId FROM forum_svar AS fs GROUP BY fs.emneid ORDER BY LastThreadId DESC) n ON (n.LastThreadId = fs.id) WHERE n.LastThreadId IS NOT NULL
这将为您提供最新的线程。享受吧
另外,如果答案可行,别忘了接受 我建议您不要将时间戳作为数字存储在mysql数据库中。用它代替。不,它不是。如果主题有任何答案,它会打印很多次如果一个主题有一个答案,它会在主题列表上打印主题2次,没有答案的主题只打印一次,但在底部..现在呢?尝试我在这里的查询,我编辑了它。哦,你不应该使用*而应该指定你需要的字段作为回报,而不是所有的字段。谢谢!它现在几乎可以工作了。但它只是从每个主题的第一个答案中对主题进行排序。它应该在主题的最后一个答案之后简短。你能帮忙吗它不起作用:P只是将最后一个活动列添加到主题表中,然后对其进行排序。无论如何,谢谢你的帮助!:到底是什么不起作用?我可能会键入错误,因为我必须重写查询以适应您的表结构。。