帮助在php中对数据库(JOIN?)中的结果进行排序

时间:2011-06-24 12:45:03

标签: 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',
    `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

有任何帮助吗? :)

1 个答案:

答案 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

这将为您提供最新的主题。请享用! :)
附:如果成功了,别忘了接受答案!