Помогите с сортировкой результатов из базы данных (JOIN?) В php - PullRequest
0 голосов
/ 24 июня 2011

Я немного обновляю свой форум и хочу изменить способ перечисления тем.

Мои темы хранятся в этой таблице:

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 равно id в таблице forum_emner):

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

дата - это когда был опубликован ответ (time () в php).

Что я хочу: я хочу отсортировать темы после поля, dato в forum_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 голосов
/ 24 июня 2011

Примечание: вы должны использовать AS, как я делаю ниже, чтобы запрос выглядел более читабельным.И вы не должны хранить имена полей MySQL в чем-то отличном от английского.Что делать, если вы нанимаете кого-то, кто не говорит на вашем языке?:)

Первое, что нужно сделать, это получить новейшие идентификаторы потоков.Мы можем сделать это с помощью такого запроса:

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

Теперь вы получите самые новые темы.Наслаждайтесь!:)
PS Не забудьте принять ответ, если он сработал!

...