[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL запрос
Skesh
Доброго времени суток, мне нужно сделать выборку за 1,5 месяца, делаю такой запрос:
$line = mysql_fetch_row(mysql_query("SELECT `electro1`, `electro2`, `electro3`, `electro4`, `electro5` FROM `energobalans2012` WHERE `date` BETWEEN '2011-12-15' AND '2012-01-31' ORDER BY `date`"));

он выбирает только одну запись, а мне нужно все даные за этот переод, плюс не пойму как к ним потом обращатся, скажем
$rez=$line[0]+$line[1];
наверное не подойдет, это будет двумерный масив? скорее так?:
$rez=$line[0][0]+$line[0][1];

Помогите плиз, пробежался по форуму, нашел похожую проблему но боюсь что сам не разберусь...



Спустя 14 минут, 1 секунда (28.01.2012 - 23:39) dadli написал(а):
Skesh
ваш запрос правилни, попрубуите так написать


$res  =  mysql_query("SELECT `electro1`, `electro2`, `electro3`, `electro4`, `electro5` FROM `energobalans2012` WHERE `date` BETWEEN '2011-12-15' AND '2012-01-31' ORDER BY `date`")
or die(mysql_error());


while($row = mysql_fetch_assoc($res)) {
echo $row['electro1']." - ".$row['electro2'].'...'."<br>";
}

Спустя 5 минут, 55 секунд (28.01.2012 - 23:45) Winston написал(а):
Напиши print_r($line); и посмотри какой там массив.
А насчет сложения, попробуй так
echo (int)$line[0]+(int)$line[1];

Спустя 3 минуты, 13 секунд (28.01.2012 - 23:48) YVSIK написал(а):
есть такая функция
$var = array mysql_fetch_assoc ($line)
// или для двумерного
$var= array mysql_fetch_array ($line)

далее методом перебора с помощью цикла как пример

 while($var)
{// как пример выборки 10 рядов
echo ($var<=10) ;
}

Спустя 1 минута, 43 секунды (28.01.2012 - 23:50) Skesh написал(а):
dadli спасибо помогло. Я пытаюсь оптимизировать запрос скажем раньше я в цыкле задавал дату и делал расчеты, типа так:

$rez=0;
for ($year>=2011; $year<=2012; $year++)
{
for ($month>=1; $month<=12; $month++)
{
$line = mysql_fetch_row(mysql_query("SELECT `electro1`, `electro2`, `electro3`, `electro4`, `electro5` FROM `energobalans2012` WHERE `date`='$year-$month-01'"));
for ($i>=0; $i<=4; $i++)
{
$rez=$rez+$line[$i];
}
}

echo $rez;
}


немного почитал и добрые люди подсказали что количество обращений к БД нужно свести к минимуму, тогда скрипт работать будет быстрее, тот способ который Вы предложили ефективнее даного? ведь я смотрю в цикле while все тоже количество обращений??? Если я не прав не смейтесь сильно B) я просто пытаюсь разобраться...

Спустя 12 минут, 58 секунд (29.01.2012 - 00:03) dadli написал(а):
Skesh
сделать запроси в цикле ето плохо и нужна максимални избегать от него, а маём примере (ето не маё, ето стандартни варянт) происходит обрашение к бд один раз, а вцикле происходит толко перебор полученних данних из запроса. конечно ето лучшее

Спустя 9 часов, 57 минут, 35 секунд (29.01.2012 - 10:00) Skesh написал(а):
еще вопрос: мне нужно вывести все даные за месяц, если их нету за какойто месяц то нужно вывести 0, в моем варианте это происходит, а в Вашем идет выборка только существующих записей, и если скажеи нет записи за 12 месяц то оно даст не 0 а просто пропустит его, как быть? можно вместо while использовать for вот скажем так будет правильно?:


$year1=2012;
$month1=1;
$k1=date("t", strtotime($year1 . "-" . $month1. "-01")); // получаем количество дней в этом месяце

$year2=$year1;
$month2=$month1+1;
$k2=date("t", strtotime($year2 . "-" . $month2. "-01")); // получаем количество дней в следующем месяце

$line = mysql_query("SELECT `electro1`, `electro2`, `electro3`, `electro4`, `electro5` FROM `energobalans2012` WHERE `date` BETWEEN '$year1-$month1-15' AND '$year2-$month2-$k2' ORDER BY `date`");


for ($i>=0; $i<=$k1+$k2; $i++)
{ $rez=0;
$row = mysql_fetch_assoc($line);
for ($j>=0; $j<=count($row); $j++)
{
$rez=$rez+$row[$j];
}
echo "$i - $rez - ".count($row)."<p>";
}


ну и сразу там и делать все расчеты, чтобы не создавать еще один цыкл с расчетами, но вот не работает, выдает нули, как быть?

Спустя 2 часа, 25 минут, 27 секунд (29.01.2012 - 12:26) dadli написал(а):
Цитата
если их нету за какойто месяц то нужно вывести 0

ето хотели:

$res  =  mysql_query("какоита запрос")
or die(mysql_error());

if (mysql_num_rows($res) == 0) {
echo 0;
}
else {
while($row = mysql_fetch_assoc($res)) {
echo $row['electro1']." - ".$row['electro2'].'...'."<br>";
}
}

Спустя 24 минуты, 26 секунд (29.01.2012 - 12:50) Skesh написал(а):
не совсем, взгляните на картинку:
user posted image
у меня там три записи за 01, 03, и 07 число, мне нужно чтобы цикл выводил 7 значений, с 1 по 7 число включительно, если использовать while то он выдаст только те 3 значения за 01, 03, и 07 число, и все, а мне нужно чтобы за 02, 04, 05 и 06 число выдавало нули, вот такой результат:
user posted image
можно так сделать?

Спустя 1 час, 50 минут, 38 секунд (29.01.2012 - 14:41) YVSIK написал(а):
при выборке как ? а никак!! выборка будет только та что есть в базе , значит сделать в пустые дни добавлять эти дни пустыми строчками и автоматом присваивать ID тогда и будет выборка пустых полей и то в случае если записать эти нули в базу

как реализовать пустые дни? хм)) либо написать скрипт который это будет делать ежедневно, либо при добовалении новой записии делать запрос, разчет того что есть, и если есть не соответствие скажем дням месяца то добавить
и ещё вариант
писать скрипт который без добавления всегда будет делать эти разсчеты и заносить при твоем выводе недостающие записи
все будет упираться в дни месяцев и вычислений что недостает этих дней по ID
вообщем возможны варианты

Спустя 8 минут, 38 секунд (29.01.2012 - 14:49) Skesh написал(а):
все не подходит, а через for никак нельзя?

Спустя 6 минут, 57 секунд (29.01.2012 - 14:56) Skesh написал(а):
Цитата (YVSIK @ 29.01.2012 - 11:41)
писать скрипт который без добавления всегда будет делать эти разсчеты и заносить при твоем выводе недостающие записи

можно кусочек примера? мне не нужно заносить недостающие записи, мне просто нужен расчет чтоб выдавал 0 при них, мне бы кусочек примера, оч прошу...

Спустя 6 минут, 22 секунды (29.01.2012 - 15:03) dadli написал(а):
Skesh
$date1 = '2012-01-01';
$date2 = '2012-01-07';
$res = mysql_query("
SELECT `electro1`, `electro2`,`date` FROM `energobalans2012`
WHERE `date` BETWEEN '"
.$date1."' AND '".$date2."' ORDER BY `date`")
or die(mysql_error());

$arr_iz_tablic = array();
while($row = mysql_fetch_row($res)) {
array_push($arr_iz_tablic,$row[2]);
}
mysql_data_seek($res,0);

$mas = array();
$start = strtotime($date1);
while ($start <= strtotime($date2)) {
array_push($mas,date("Y-m-d",$start));
$start = $start + (3600*24);
}

foreach ($mas as $v) {
if (in_array($v,$arr_iz_tablic)) {
$row = mysql_fetch_row($res);
echo $row[0]." | ".$row[1].'<br>';
}
else {
echo '0 | 0 <br>';
}
}

Спустя 18 минут, 33 секунды (29.01.2012 - 15:21) Skesh написал(а):
dadli спасибо большое!!! Работает!!! =)

Спустя 35 минут, 56 секунд (29.01.2012 - 15:57) Skesh написал(а):
ээээ запуталься немного, а если мне нужна разница чисел сегоднешнього и предыдущего, если предыдущее=0 то шаг назад еще на одно число, пробывал так:

$i=0;
foreach ($mas as $v) {
if (in_array($v,$arr_iz_tablic)) {
$row = mysql_fetch_row($res);
echo $row[0]." | ".$row[1].'<br>';
$num1[$i]=$row[0];
$num2[$i]=$row[1];
$i++;
}
else {
$num1[$i]=0;
$num2[$i]=0;
$i++;
echo '0 | 0 <br>';
}
}


for ($i>=1; $i<=count($num1); $i++)
{ $psum=$num1[$i-1]+$num2[$i-1];
if ($i>1 AND $psum==0)
{ for ($q<=$i-1; $q>=0; $q--)
{ $psum=$num1[$q]+$num2[$q];
if ($psum>0)
break;
}
}

$x=($num1[$i]+$num2[$i])-$psum;
echo "$i - $x <p>";
}
не работает, да еще и зациклюет, есть идеи?

Спустя 1 час, 6 минут, 43 секунды (29.01.2012 - 17:04) GET написал(а):
Цитата
foreach ($mas as $v) {
if (in_array($v,$arr_iz_tablic)) {
  $row = mysql_fetch_row($res);
  echo $row[0]." | ".$row[1].'<br>';
  $num1[$i]=$row[0];
  $num2[$i]=$row[1];
  $i++;


по-моему пропустил $i=> здесь должно быть foreach ($mas as $i=>$v) {

а ниже я не понял $i++; i-c другого места переменная что ли. Помоему эта строчка вообще не нужна.

Спустя 17 минут, 23 секунды (29.01.2012 - 17:21) Skesh написал(а):
ой пардон цыкл неправильно написал, все работает.

Спустя 1 минута, 1 секунда (29.01.2012 - 17:22) Skesh написал(а):
A.B.C. почему не нужна? а как номер в масиве назначить?

Спустя 2 минуты, 5 секунд (29.01.2012 - 17:24) Skesh написал(а):
A.B.C. да вы правы =) виноват =)

Спустя 2 минуты, 1 секунда (29.01.2012 - 17:27) GET написал(а):
Skesh
Почитай как работает foreach

Когда ты прописываешь в

foreach ($mas as $i=>$v) 
{
echo $i.'-номер переменной массива, '.$v.'-его значение';
}

Спустя 45 минут, 37 секунд (29.01.2012 - 18:12) Skesh написал(а):
ну все ну вот последний раз спрашиваю и все =)
вот код:

$date1 = '2012-01-01';
$date2 = '2012-01-10';
$res = mysql_query("
SELECT `samedate`, `electro1`, `electro2` FROM `1`
WHERE `date` BETWEEN '"
.$date1."' AND '".$date2."' ORDER BY `date`")
or die(mysql_error());

$arr_iz_tablic = array();
while($row = mysql_fetch_row($res)) {
array_push($arr_iz_tablic, $row[0]);
}
mysql_data_seek($res,0);

$mas = array();
$start = strtotime($date1);
while ($start <= strtotime($date2)) {
array_push($mas,date("Y-m-d",$start));
$start = $start + (3600*24);
}


foreach ($mas as $i=>$v) {
if (in_array($v,$arr_iz_tablic)) {
$row = mysql_fetch_row($res);
$num1[$i]=$row[1];
$num2[$i]=$row[2];
$num3[$i]=$row[0];
}
else {
$num1[$i]=0;
$num2[$i]=0;
$num3[$i]=0;
}
}


for ($i=0; $i<count($num1); $i++)
{
echo "$num3[$i]: $num1[$i]<p>";
}

вото результат:
2012-01-01: 5083

2012-01-02: 5098

2012-01-03: 5113

2012-01-04: 5134

2012-01-05: 5158

2012-01-06: 5182

2012-01-07: 5200

2012-01-08: 5216

2012-01-09: 5231

0: 0

если изменю (+5 дней):
$date1 = '2012-01-01';
$date2 = '2012-01-15';

результат:
2012-01-01: 5083

2012-01-02: 5098

2012-01-03: 5113

2012-01-04: 5134

2012-01-05: 5158

2012-01-06: 5182

2012-01-07: 5200

2012-01-08: 5216

2012-01-09: 5231

2012-01-10: 5252

2012-01-11: 5275

2012-01-12: 5303

2012-01-13: 5324

2012-01-14: 5344

0: 0

вопрос: почему последний день всегда 0??? если оно не 0!!

Спустя 42 минуты, 19 секунд (29.01.2012 - 18:54) GET написал(а):
Skesh

у тебя несколько массивов $arr_iz_tablic, $mas

сделай для них foreach и помотри их содержимое поймешь откуда вылазит 0.

Спустя 4 минуты, 36 секунд (29.01.2012 - 18:59) GET написал(а):
Я имею ввиду внутрь foreach () вставь
{echo} сделай отладку smile.gif

Спустя 26 минут, 1 секунда (29.01.2012 - 19:25) Skesh написал(а):
боюсь это для меня сложновато blink.gif что куда встаивть? можете написать?


_____________
*пускает слюну, глядя на код* :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.