我稍微升级了我的论坛,并希望改变列出主题的方式。
我的主题存储在此表中:
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
主题答案存储在此表中(emneid等于forum_emner表中的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中的time())。
我想要的是:我想在field_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
有任何帮助吗? :)
答案 0 :(得分:0)
附注:您应该使用AS
,因为我的方法是使查询看起来更具可读性。
并且您不应该将您的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
这将为您提供最新的主题。请享用! :)
附:如果成功了,别忘了接受答案!