|
|
|
| Здравствуйте!
Возникла следующая проблема. Вот дамп трех таблиц из форума
--
-- Структура таблицы `forum_forums`
--
CREATE TABLE `forum_forums` (
`id` int(11) NOT NULL auto_increment,
`name` text NOT NULL,
`invisible` smallint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5 ;
-- --------------------------------------------------------
--
-- Структура таблицы `forum_messages`
--
CREATE TABLE `forum_messages` (
`id` int(11) NOT NULL auto_increment,
`topic` int(11) NOT NULL,
`userid` int(11) default NULL,
`text` text NOT NULL,
`fileid` int(11) NOT NULL default '0',
`time` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=44 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=44 ;
-- --------------------------------------------------------
--
-- Структура таблицы `forum_topics`
--
CREATE TABLE `forum_topics` (
`id` int(11) NOT NULL auto_increment,
`inforum` int(11) NOT NULL,
`userid` int(11) NOT NULL,
`name` text NOT NULL,
`time` int(10) NOT NULL,
`warn` smallint(1) NOT NULL default '0',
`moved` int(11) NOT NULL default '0',
`closed` smallint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=19 ;
|
Тоесть
forum_forums - таблица с форумами
forum_topics - таблица с темами (поле inforim отвечает за то, в какой форум она вложена)
forum_messages - таблица с сообщениями ( topic отвечает за принадлежность к теме)
Необходимо вывести ТОП-темы (сортировка по количеству сообщений в них), учитывая, что:
- темы не должны быть закрепленными (forum_topics.warn != 1)
- не закрытые ( forum_topics.closed != 1 )
- Тема не вложена в скрытый форум ( forum_forums.invisible != 1 )
Использую следующий запрос:
$query = "SELECT `forum_topics` . * , COALESCE( cnt, 0 ) AS mcnt
FROM `forum_topics`
LEFT JOIN (
SELECT `topic` , COUNT( `id` ) AS `cnt`
FROM `forum_messages`
GROUP BY `topic`
) AS tc ON forum_topics.inforum = tc.topic
LEFT JOIN (
SELECT `invisible` AS `inv`
FROM `forum_forums`
) AS invi ON invi.inv <>1
WHERE `closed` <>1 AND `warn`<>1
ORDER BY mcnt DESC
LIMIT " . $st . ", " . ( $config['top_on_page'] );
|
Результат вообще неожиданный - выводит 2 раза ОДНУ И Т У ЖЕ тему с 2 постами, 2 раза ОДНУ И ТУ ЖЕ с четыремя, один раз с шестью..
ПОдскажите где ошибся?
Дамп могу предоставить.. | |
|
|
|
|
|
|
|
для: Le bien
(03.09.2008 в 16:14)
| | второй LEFT JOIN соединяет таблицы безо всякого условия.
Что порождает JOIN без условия нужно объяснять? | |
|
|
|
|
|
|
|
для: Trianon
(03.09.2008 в 16:28)
| | Хм действительно, запрос просто без условия..
Путаюсь все равно, как его туда втюхать, слабое знание MySQL.. Знаю что неправильно, но все же как получить значение forum_topics.inforum во второй LEFT JOIN?
SQL-запрос:
SELECT `forum_topics`. * , COALESCE( cnt, 0 ) AS mcnt
FROM `forum_topics`
LEFT JOIN (
SELECT `topic` , COUNT( `id` ) AS `cnt`
FROM `forum_messages`
GROUP BY `topic`
) AS tc ON forum_topics.inforum = tc.topic
LEFT JOIN (
SELECT `invisible` AS `inv` , `id`
FROM `forum_forums`
WHERE `id` = `forum_topics`.`inforum`
) AS invi ON invi.inv <>1
WHERE `closed` <>1
AND `warn` <>1
ORDER BY mcnt DESC
LIMIT 0 , 30
Ответ MySQL:
#1054 - Unknown column 'forum_topics.inforum' in 'where clause'
|
| |
|
|
|
|
|
|
|
для: Le bien
(03.09.2008 в 16:44)
| |
SELECT `forum_topics`. * , COALESCE( cnt, 0 ) AS mcnt
FROM `forum_topics`
LEFT JOIN (
SELECT `topic` , COUNT( `id` ) AS `cnt`
FROM `forum_messages`
GROUP BY `topic`
) AS tc ON forum_topics.inforum = tc.topic
LEFT JOIN (
SELECT `invisible` AS `inv`
FROM `forum_forums`
WHERE `id` = `forum_topics`.`inforum`
) AS invi ON invi.id = tc.inforum
WHERE `closed` <>1
AND `warn` <>1
AND `inv` <>1
ORDER BY mcnt DESC
LIMIT 0 , 30
|
| |
|
|
|
|
|
|
|
для: Trianon
(03.09.2008 в 16:52)
| | Вы немного ошиблись и написали с ошибкой..
Все таки так получается:
SELECT `forum_topics`. * , COALESCE( cnt, 0 ) AS mcnt
FROM `forum_topics`
LEFT JOIN
(
SELECT `topic` , COUNT( `id` ) AS `cnt`
FROM `forum_messages`
GROUP BY `topic`
)
AS tc ON forum_topics.id = tc.topic
LEFT JOIN
(
SELECT `id` , `invisible` AS `inv`
FROM `forum_forums`
)
AS invi ON invi.id = `forum_topics`.`inforum`
WHERE `closed` <>1
AND `warn` <>1
AND `inv` <>1
ORDER BY mcnt DESC
|
| |
|
|
|
|
|
|
|
для: Le bien
(03.09.2008 в 17:47)
| | Да.
Но можно еще проще.
SELECT `forum_topics`. * , COALESCE( cnt, 0 ) AS mcnt
FROM `forum_topics`
LEFT JOIN
(
SELECT `topic` , COUNT( `id` ) AS `cnt`
FROM `forum_messages`
GROUP BY `topic`
)
AS tc ON forum_topics.id = tc.topic
LEFT JOIN
`forum_forums`
ON `forum_forums`.id = `forum_topics`.`inforum`
WHERE `closed` <>1
AND `warn` <>1
AND `invisible` <>1
ORDER BY mcnt DESC
|
| |
|
|
|