Перейти к содержимому


Как правильно сформулировать SQL запрос?

sql select

Сообщений в теме: 9

#1 serg499

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

  • Пользователи
  • PipPipPip
  • 109 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 10 Сентябрь 2013 - 15:22

Здравствуйте! Подскажите, пож-та, по MySQL!
Необходимо сначала из одной таблицы получить номера нужных заказов (1 запрос, вроде, нормально работает),
а затем подсчитать общую сумму для заказов с полученными из первого запроса номерами. Оснрвнрй вопрос по выделенному жирным фрагменту, в котором как раз и сравниваю номер заказа с номерами нужных заказов. Как понимаю, синтаксис выделенного жирным неправильный, а как правильно?

//1 запрос
$sqlQuery = "SELECT f4151 as nzakazov FROM ".DATA_TABLE."251
WHERE status=0 AND f4171='".$line['Номер']."'";

$result = mysql_query($sqlQuery);
$row = mysql_fetch_array($result); // Получаем номера нужных нам заказов

//2 запрос
$sqlQuery = "SELECT sum(f967) as sumzakazov FROM ".DATA_TABLE."86
WHERE status=0 AND f929 = $row"; // Считаем общую сумму заказов, имеющих номера, полученные в предыдущем запросе

$result = mysql_query($sqlQuery);
$row = mysql_fetch_array($result);

$line['Общая сумма'] = $row['sumzakazov'];

Сообщение отредактировал serg499: 10 Сентябрь 2013 - 15:24


#2 wondertalik

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

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 10 Сентябрь 2013 - 22:59

$sqlQuery = "SELECT `f4151` as nzakazov FROM ".DATA_TABLE."251 WHERE `status` = 0 AND `f4171` = ".intval($line['Номер'])." LIMIT 1";
$result = sql_query($sqlQuery);
$row = sql_fetch_assoc($result); // Получаем номера нужных нам заказов
Ваш код не соответствует вашому условию. В первом запросе Вам нужно получить 1 НОМЕР или НОМЕРА? Текущий код расчитан на получение 1 НОМЕРА. Ну а дальше уже сумму полуаем так.

//2 запрос
$sqlQuery = "SELECT sum(f967) as sumzakazov FROM ".DATA_TABLE."86 WHERE `status` = 0 AND `f929` = ".$row['nzakazov']; // Считаем общую сумму заказов, имеющих номера, полученные в предыдущем запросе
$result = sql_query($sqlQuery);
$row = sql_fetch_assoc($result);
$line['Общая сумма'] = $row['sumzakazov'];

Сообщение отредактировал wondertalik: 10 Сентябрь 2013 - 23:02


#3 serg499

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

  • Пользователи
  • PipPipPip
  • 109 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 11 Сентябрь 2013 - 10:32

Просмотр сообщенияwondertalik (10 Сентябрь 2013 - 22:59) писал:

Ваш код не соответствует вашому условию. В первом запросе Вам нужно получить 1 НОМЕР или НОМЕРА? Текущий код расчитан на получение 1 НОМЕРА.
Видимо, тогда и в первом запросе ошибка. Нужно получить номера (1 номер - только частный случай)...

Сообщение отредактировал serg499: 11 Сентябрь 2013 - 10:33


#4 wondertalik

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

  • Пользователи
  • PipPipPip
  • 1 156 сообщений
  • Пол:Мужчина
  • Город:Кривой Рог, Украина

Отправлено 11 Сентябрь 2013 - 10:40

Просмотр сообщенияserg499 (11 Сентябрь 2013 - 10:32) писал:

Видимо, тогда и в первом запросе ошибка. Нужно получить номера (1 номер - только частный случай)...
//Получаем все номера
$sqlQuery = "SELECT `f4151` as nzakazov FROM ".DATA_TABLE."251 WHERE `status` = 0 AND `f4171` = ".intval($line['Номер']);
$result = sql_query($sqlQuery);
if(sql_num_rows($result) > 0) {
	while($row = sql_fetch_assoc($result)) {
		//определяем по каждому номеру общую сумму
		$sqlQuery = "SELECT sum(f967) as sumzakazov FROM ".DATA_TABLE."86 WHERE `status` = 0 AND `f929` = ".$row['nzakazov']; // Считаем общую сумму заказов, имеющих номера, полученные в предыдущем запросе
		$rr_w = sql_query($sqlQuery);
		if(sql_num_rows($rr_w) > 0) {
			$row2 = sql_fetch_assoc($rr_w);
            $summ += $row2['sumzakazov'];
        }
	}
}
$line['Общая сумма'] = $summ;
Как-то так.

Сообщение отредактировал wondertalik: 11 Сентябрь 2013 - 10:40


#5 serg499

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

  • Пользователи
  • PipPipPip
  • 109 сообщений
  • Пол:Мужчина
  • Город:Москва

Отправлено 11 Сентябрь 2013 - 11:12

Все работает! Спасибо огромное! :)

#6 web-nik

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 04 Август 2014 - 10:11

Добрый день. Прошу помочь разобраться ..
Для формирования данных для отчета, пытаюсь выбрать данные по следующему принципу . Найти минимальное значение времени по столбцу "time - f4020" и забрать значение из столбца "money- f3880"


$result2 = sql_select_field("`".DATA_TABLE."270`","MAX(f4020) AS `time`, f3880 AS `money`","`f4020`>='",$date1_fet,"' AND `f4020`<='",$date2_fet,"' AND `f4120`='",$data['company'],"' AND `status`='0' " );

Максимальное время находит, но значение из f3880, не соответствует записи f4020 .
Где ошибка?

#7 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 04 Август 2014 - 11:21

Оно и не должно никак соответствовать, т.к. "MAX(f4020)" выводит максимальное значение из всех строк, подпадающих под условие отбора, а "f3880" - просто выводит значение из текущей строки.

Например, если я делаю проход по всем сотрудникам организации, то "max(Возраст)" будет всегда выдавать самого старого, а "Имя" - просто имя текущего сотрудника, например первого из выборки, или второго, третьего и т.д, на следующем шаге.

#8 web-nik

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 04 Август 2014 - 11:27

Тогда помогите пож-та, как построить запрос ?

#9 CbCoder

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

  • Программист ООО "КБ"
  • PipPipPip
  • 8 693 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 04 Август 2014 - 11:38

Вариантов несколько, например использовать MAX(f4020) в параметрах отбора, но есть более оптимальный вариант. Необходимо отсортировать запрос по полю f4020, если вам нужно максимальное значение то сортировка должна быть обратной:

data_select_field(270, "f3880 AS `money`", "`f4020`>='",$date1_fet,"' AND `f4020`<='",$date2_fet,"' AND `f4120`='",$data['company'],"' AND `status`='0' ORDER BY f4020 DESC");

Соответственно, тогда в первой записи будет именно то что вам нужно.

#10 web-nik

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 04 Август 2014 - 12:13

Заработало...! Спасибо!





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных