Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос с условием #2
 
 автор: Le bien   (03.09.2008 в 16:14)   письмо автору
 
 

Здравствуйте!

Возникла следующая проблема. Вот дамп трех таблиц из форума


-- 
-- Структура таблицы `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 раза ОДНУ И ТУ ЖЕ с четыремя, один раз с шестью..

ПОдскажите где ошибся?
Дамп могу предоставить..

  Ответить  
 
 автор: Trianon   (03.09.2008 в 16:28)   письмо автору
 
   для: Le bien   (03.09.2008 в 16:14)
 

второй LEFT JOIN соединяет таблицы безо всякого условия.
Что порождает JOIN без условия нужно объяснять?

  Ответить  
 
 автор: Le bien   (03.09.2008 в 16:44)   письмо автору
 
   для: 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'

  Ответить  
 
 автор: Trianon   (03.09.2008 в 16:52)   письмо автору
 
   для: 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 

  Ответить  
 
 автор: Le bien   (03.09.2008 в 17:47)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (03.09.2008 в 18:30)   письмо автору
 
   для: 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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования