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
Форумы портала PHP.SU :: Версия для печати :: составной запрос
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » составной запрос

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

1. DlTA - 12 Сентября, 2012 - 14:31:58 - перейти к сообщению
упрощенный вариант задачи можно представить так:
табличка с числовыми значениями (любыми)

в запросе нужно определить сколько значений попало в каждый предложенный интервал
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;

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

может есть варианты?
2. Мелкий - 12 Сентября, 2012 - 14:37:01 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT sum(field_value BETWEEN 0 AND 5),....

Работает за счёт приведения булевых типов к числам.
3. EuGen - 12 Сентября, 2012 - 15:05:33 - перейти к сообщению
Работать-то оно, разумеется, будет. Вот только скорость не будет превосходить N запросов через WHERE..BETWEEN
Так ли уж важно сделать одним запросом?
4. DlTA - 12 Сентября, 2012 - 17:31:29 - перейти к сообщению
EuGen пишет:
Так ли уж важно сделать одним запросом?
хоца красоты и совершенства

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

теоретически подразумевается что я проведу всю первоначальную выборку по всем необходимым условиям, и лишь результат сформирую не в виде длинючего списка элементов а прям в мускл получу статистику. это плохо?
5. DlTA - 13 Сентября, 2012 - 00:03:40 - перейти к сообщению
а вот к примеру табличка из 3-х полей
первое индекс, второе и третье числовые, положительные отрицательны, друг от друга не зазависят
id, val1, val2

на выходе хочется получить чет типа
id, val
причем данные под val это могут быть значения как из второго поля так и из третьего
ну например если во втором поле положительное то берем его, если отрицательное то берем из третьего столбца
такое можно реализовать на мускл?
6. tuareg - 13 Сентября, 2012 - 00:56:56 - перейти к сообщению
DlTA пишет:

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

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

Да и еще по теме, может просто посмотреть EXPLAIN запросов с COUNT и попытаться их оптимизировать.
7. Мелкий - 13 Сентября, 2012 - 09:47:34 - перейти к сообщению
DlTA пишет:
а почему

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

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

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

 

Powered by ExBB FM 1.0 RC1