Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: составной запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: как корректно построить
DlTA
Отправлено: 12 Сентября, 2012 - 14:31:58
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




упрощенный вариант задачи можно представить так:
табличка с числовыми значениями (любыми)

в запросе нужно определить сколько значений попало в каждый предложенный интервал
1<=.<=2 (интервал 1)
3<=.<=5, (интервал 2)
10<=.<=15 (интервал 3)
на выходе должно получиться
чет типа
$res['interval_1']=5
$res['interval_2']=1
$res['interval_3']=6

как это сделать 3-мя запросами понятно, а вот как это сделать 1м
вариант типа
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.   (SELECT COUNT(`id`) FROM `tab` WHERE ...) AS interval_1
  3.  , (SELECT COUNT(`id`) FROM `tab` WHERE ...) AS interval_2
  4.  , (SELECT COUNT(`id`) FROM `tab` WHERE ...) AS interval_3;

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

может есть варианты?

(Отредактировано автором: 12 Сентября, 2012 - 17:33:10)

 
 Top
Мелкий Супермодератор
Отправлено: 12 Сентября, 2012 - 14:37:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT sum(field_value BETWEEN 0 AND 5),....

Работает за счёт приведения булевых типов к числам.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 12 Сентября, 2012 - 15:05:33
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Работать-то оно, разумеется, будет. Вот только скорость не будет превосходить N запросов через WHERE..BETWEEN
Так ли уж важно сделать одним запросом?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
DlTA
Отправлено: 12 Сентября, 2012 - 17:31:29
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




EuGen пишет:
Так ли уж важно сделать одним запросом?
хоца красоты и совершенства

а почему
EuGen пишет:
скорость не будет превосходить N запросов через WHERE..BETWEEN

теоретически подразумевается что я проведу всю первоначальную выборку по всем необходимым условиям, и лишь результат сформирую не в виде длинючего списка элементов а прям в мускл получу статистику. это плохо?
 
 Top
DlTA
Отправлено: 13 Сентября, 2012 - 00:03:40
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




а вот к примеру табличка из 3-х полей
первое индекс, второе и третье числовые, положительные отрицательны, друг от друга не зазависят
id, val1, val2

на выходе хочется получить чет типа
id, val
причем данные под val это могут быть значения как из второго поля так и из третьего
ну например если во втором поле положительное то берем его, если отрицательное то берем из третьего столбца
такое можно реализовать на мускл?
 
 Top
tuareg
Отправлено: 13 Сентября, 2012 - 00:56:56
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




DlTA пишет:

ну например если во втором поле положительное то берем его, если отрицательное то берем из третьего столбца
такое можно реализовать на мускл?

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT IF(val1>0,val1,val2) .....
  3.  

Да и еще по теме, может просто посмотреть EXPLAIN запросов с COUNT и попытаться их оптимизировать.

(Отредактировано автором: 13 Сентября, 2012 - 01:47:52)

 
 Top
Мелкий Супермодератор
Отправлено: 13 Сентября, 2012 - 09:47:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




DlTA пишет:
а почему

Потому что условие в sum будет проверяться для каждой строки, подпадающей под группировку, плюс с невозможностью использования индекса для этого.

EuGen пишет:
Вот только скорость не будет превосходить N запросов через WHERE..BETWEEN

Может быть и быстрее, если джойны строятся дольше, чем непосредственно подсчёт.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB