Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL-запрос с COUNT из связанных таблиц, посчитать кол-во постов в форуме. 
V
    Опции темы
thomas
Дата 27.10.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: нет
Всего: 65



Приветствую всех.
Что-то я не соображу. Форум - Топик - Посты. Надо посчитать посты во всех топиках одного форума.
Есть две таблицы (привожу только необходимые поля)

tblTopics
TopicID - PK - int автонумерация
TopicTitle
TopicForumID - FK  - связь с таблицей форумов

tblPosts
PostID - PK - int автонумерация.
PostText
PostTopicID - FK -  связь с таблицей топиков

Наваял такой запрос
Код

SELECT COUNT(*) as totaal FROM tblPosts WHERE PostTopicID = (SELECT TopicID FROM tblTopics WHERE TopicForumID=1)

типа посчитай мне все строки в которых ID топиков равны выбранным ID топиков для заданного ID форума.
База данных mySQL

Не работает.

Подскажите в чем не прав и как это решается.
Заранее спасибо.
С наилучшими пожеланиями Томас.  smile 

ЗЫ может я в корне не прав, пытаясь подставить в условие не одно значение, а возможно несколько.(результат выборки из другой таблицы по другому условию)

Это сообщение отредактировал(а) thomas - 27.10.2007, 21:29


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Akina
Дата 27.10.2007, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



На коленке - где-то вот такое должно быть
Код

Select Count(*)
From tblPosts
Join tblTopics
  On tblPosts.PostTopicID = tblTopics.TopicID 
Where TopicForumID = 1



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
thomas
Дата 27.10.2007, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: нет
Всего: 65



Akina, 
Спасибо.  smile 
Ведь думал же про JOIN.

Да век живи век учись.  smile 

ЗЫ а то я там в PHP циклы замутил.  smile 

Это сообщение отредактировал(а) thomas - 27.10.2007, 22:20


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
ivashkanet
Дата 30.10.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(thomas @  27.10.2007,  21:26 Найти цитируемый пост)
SELECT COUNT(*) as totaal FROM tblPosts WHERE PostTopicID = (SELECT TopicID FROM tblTopics WHERE TopicForumID=1)

Кста, если вместо = написать IN, то твой тоже прокатит
Код

SELECT COUNT(*) as totaal FROM tblPosts WHERE PostTopicID IN (SELECT TopicID FROM tblTopics WHERE TopicForumID=1)
 

P.S. Это проверено на оракле и MS SQL Server. За остальных не ручаюсь smile 
PM MAIL WWW ICQ   Вверх
Akina
Дата 30.10.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(ivashkanet @  30.10.2007,  17:07 Найти цитируемый пост)
Это проверено на оракле и MS SQL Server.

А попутно не глянул скорость выполнения этого и написанного мной запросов? это гораздо интереснее...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ivashkanet
Дата 30.10.2007, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Akina, не глянул smile И? (Судя по твоему сарказму, join работает много быстрее, так?)
PM MAIL WWW ICQ   Вверх
Deniz
Дата 31.10.2007, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(ivashkanet @  30.10.2007,  19:20 Найти цитируемый пост)
Судя по твоему сарказму, join работает много быстрее, так?

Однозначно, причем в разы. Для понимания скорости достаточно посмотреть план запроса.

Это сообщение отредактировал(а) Deniz - 31.10.2007, 06:10


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 31.10.2007, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(ivashkanet @  30.10.2007,  17:20 Найти цитируемый пост)
Судя по твоему сарказму

Да? блин, сорри, но не было сарказма. Был именно интерес - достанет ли у СБД ума сообразить, что подзапрос достаточно выполнить один раз... 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ivashkanet
Дата 31.10.2007, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Akina, сорри. Просто я был уверен, что ты сталкивался с такими запросами раньше и давно знаешь что быстрее, а что нет вот и углядел сарказм  smile 
Сча попробуем smile
PM MAIL WWW ICQ   Вверх
Deniz
Дата 31.10.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(Deniz @  31.10.2007,  09:08 Найти цитируемый пост)
Однозначно, причем в разы. Для понимания скорости достаточно посмотреть план запроса.

Беру часть своих слов обратно:
  • для MSSQL 2000 результат одинаков. (join чуть-чуть выиграл, но можно списать на погрешность вычисления)
  • для FireBird 1.5 JOIN выиграл по полной, т.е. подзапрос в in выполняется для каждой строки.
Для других нет возможности проверить.
Теперь стало интересно как дела у Oracle и MySQL?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
ivashkanet
Дата 31.10.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(Deniz @  31.10.2007,  16:07 Найти цитируемый пост)
как дела у Oracle

Я что-то пока туплю. Не могу составить одинаковые запросы (к моей базе)  smile 
Вроде должно быть одно и то же, а количество строк отличаются раза в три  smile 
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 31.10.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Для Оракла эти запросы одинаковы. Даже экзекюшин план для них одни и тот же: с теми же весами и ты ды...

PM MAIL WWW ICQ   Вверх
Deniz
Дата 1.11.2007, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(ivashkanet @  31.10.2007,  19:49 Найти цитируемый пост)
Даже экзекюшин план для них одни и тот же

Вот и MSSQL тоже преобразовал IN в JOIN, и планы одинаковые.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akina
Дата 1.11.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(ivashkanet @  31.10.2007,  17:49 Найти цитируемый пост)
Для Оракла эти запросы одинаковы. Даже экзекюшин план для них одни и тот же: с теми же весами и ты ды...

Цитата(Deniz @  1.11.2007,  07:24 Найти цитируемый пост)
 и MSSQL тоже преобразовал IN в JOIN, и планы одинаковые.

Вот это мне лично и было интересно. 
Вернее так: меня интересовало, есть ли реальная почва под появившимися последнее время рекомендациями вместо связываний использовать более прозрачные (даже синтаксически) условные выборки. Похоже, рекомендация родилась не на пустом месте.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 1.11.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 7
Всего: 44



Цитата(Akina @  1.11.2007,  13:38 Найти цитируемый пост)
есть ли реальная почва под появившимися последнее время рекомендациями вместо связываний использовать более прозрачные (даже синтаксически) условные выборки

Вероятнее всего есть, но ...
IMHO, лучше пользовать JOIN, потому что:
  • не во всех СУБД будет такая картина
  • не факт, что на более сложном запросе тот же Oracle или MSSQL будут нормально преобразовывать
  • еще что-нибудь случится
Это мое мнение, оно сложилось от использования InterBase 4.x, и до настоящего момента стараюсь везде избегать конструкции типа 
Код
... where ... in (select ...)

Интересно кто-нибудь проверит MySQL по данному вопросу?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0625 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.