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

Форум MySQL

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

 

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

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

тема: Как объеденить такие запросы?
 
 автор: p.pavluxa   (02.12.2012 в 15:36)   письмо автору
 
 

Здравствуйте. Пожалуйста, помогите, как с этого запроса убрать два вложенных запроса? МОжно как то объеденить при помощи JOIN или как-то по другому? Подскажите как?
SELECT SQL_CALC_FOUND_ROWS 
`XeronBonusesDomains`.*,
(SELECT COUNT(*) FROM `XeronBonuses` 
WHERE `iDomainID` = `XeronBonusesDomains`.`iID`) as `iTotalBonuses`,
(SELECT COUNT(*) FROM `XeronBonuses` 
WHERE `iDomainID` = `XeronBonusesDomains`.`iID` AND
TO_DAYS( `sDate` ) = TO_DAYS( NOW() )) as `iTodayBonuses`
FROM `XeronBonusesDomains`

  Ответить  
 
 автор: Sfinks   (02.12.2012 в 17:40)   письмо автору
 
   для: p.pavluxa   (02.12.2012 в 15:36)
 

Скорее всего, если начать разбираться в структуре таблиц и данных, то можно. Вопрос только зачем?
В производительности от этого ничего не изменится. Хуже может стать. А лучше - нет.

Дело в том, что вы скорее всего думаете, что при таком написании мускул для каждой строки делает отдельный подзапрос и поэтому все медленно.
Нет.
При использовании кореллирующих подзапросов обращение к таблице подзапроса производится один раз, также как и при джойне.
Оптимизатор MySQL сам справится. Не ломайте голову.

Точно могу сказать, что SQL_CALC_FOUND_ROWS вам тут не нужен.
Он имеет смысл только при использовании LIMIT.

  Ответить  
 
 автор: oradev   (18.01.2013 в 23:39)   письмо автору
 
   для: Sfinks   (02.12.2012 в 17:40)
 

SQL_CALC_FOUND_ROWS с LIMIT лучше вообще стараться не использовать с большим числом данных, поскольку он лопатит для начала все записи, а уже потом клиенту отдает указанное в LIMIT число записей.

[поправлено модератором]

  Ответить  
 
 автор: Sfinks   (19.01.2013 в 11:38)   письмо автору
 
   для: oradev   (18.01.2013 в 23:39)
 

Не имеет смысла, потому что без LIMIT это значение всегда равно количеству строк результата.

[поправлено модератором]

  Ответить  
 
 автор: oradev   (19.01.2013 в 12:27)   письмо автору
 
   для: Sfinks   (19.01.2013 в 11:38)
 

Вы сказали:

Точно могу сказать, что SQL_CALC_FOUND_ROWS вам тут не нужен.
Он имеет смысл только при использовании LIMIT.

Сейчас вы говорите:

А не имеет смысла, потому что без LIMIT это значение всегда равно количеству строк результата.

Я что не могу его использовать для подсчета строк?

[поправлено модератором]

  Ответить  
 
 автор: Sfinks   (20.01.2013 в 15:29)   письмо автору
 
   для: oradev   (19.01.2013 в 12:27)
 

> Я что не могу его использовать для подсчета строк?
Можете. Но смысл-то в чем?
Их и так можно получить на клиенте функцией mysql_num_rows() или любым ее аналогом.
Результат будет тот же.
Верно?
Вот я и говорю, что смысла нет.

  Ответить  
 
 автор: Sfinks   (20.01.2013 в 15:24)   письмо автору
 
   для: oradev   (18.01.2013 в 23:39)
 

В следствие того, что данные в БД расположены в произвольном порядке LIMIT имеет смысл только при использовании ORDER BY. А если имеется сортировка, то УЖЕ лопатится вся таблица. Следовательно, уже нет разницы использовать SQL_CALC_FOUND_ROWS или нет.

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

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