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


Одинаковые значения


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

#1 ryskeldi

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

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

Отправлено 04 Июнь 2015 - 13:14

Как выбрать одинаковые значения в поле таблицы, т.е. повторяющихся записей в одной ячейке и суммировать остальные значение ячеек по ключу?

#2 CbCoder

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

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

Отправлено 04 Июнь 2015 - 14:48

http://www.sql.ru/do...u_sql/ch6.shtml

#3 ryskeldi

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

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

Отправлено 05 Июнь 2015 - 08:46

Спасибо. Я прочел http://www.sql.ru/do...u_sql/ch6.shtml, но не помогло. Помогите пожалуйста, я не силен MYSql. Есть таблица, которая имеет одинаковые index, name:
Id index name M1 M2 M3
1 7201 D1 2 2 2
2 7202 D2 1 1 3
3 7201 D1 4 4 4
4 7204 D4 3 3 3
5 7201 D1 4 5 5

Нужно объединить одинаковые index, name и записать в одну строку, а значение M1,M2,M3 суммировать?

#4 CbCoder

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

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

Отправлено 05 Июнь 2015 - 09:06

А что там сложного то? Не нужно быть профи по SQL, вроде все понятно расписано. Запрос то элементарный:

SELECT SUM(M1), SUM(M2), SUM(M3) FROM MyTable GROUP BY name; 

Т.е. группируем по name и используем агрегатную функцию SUM для получения сумм.

#5 ryskeldi

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

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

Отправлено 05 Июнь 2015 - 11:22

//$sqlQuery = "SELECT SUM(M1) as m1, SUM(M2) as m2 , SUM(M3) as m3 FROM".DATA_TABLE."Mytable" GROUP BY $line ['name'];//
//$res = sql_query($sqlQuery);
//$row = sql_fetch_array($res);
//$m1 = $row['m1'];
//$m2 = $row['m2'];
//$m3 = $row['m3'];
//$line['M1'] = $m1;
//$line['M2'] = $m2;
//$line['M3'] = $m3;

Сообщение отредактировал ryskeldi: 05 Июнь 2015 - 11:25


#6 ryskeldi

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

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

Отправлено 05 Июнь 2015 - 11:27

Спасибо за подсказку, посмотрите пожалуйста, так верно будет?

#7 ryskeldi

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

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

Отправлено 05 Июнь 2015 - 12:07

$sqlQuery = data_select_field(Mytable,"SUM(M1) as m1", "SUM(M2) as m2", "SUM(M3) as m3" GROUP By $line['name']);
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$m1 = $row['m1'];
$m2 = $row['m2'];
$m3 = $row['m3'];
$line['M1'] = $m1;
$line['M2'] = $m2;
$line['M3'] = $m3;

#8 CbCoder

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

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

Отправлено 05 Июнь 2015 - 17:23

Ну уж не "Mytable" разумеется, а id таблицы с данными, в этом случае. Слово "MyTable" я для примера написал, как абстрактное имя таблицы. И непонятно, зачем вы имя поля "name" заменили на значение из $line['name']? Группировка идет по имени поля, а не по его значению. Я уж не говорю про банальную ошибку синтаксиса в виде не к месту закрытой кавычки. В итоге корректный вариант:

$sqlQuery = "SELECT SUM(M1) as m1, SUM(M2) as m2, SUM(M3) as m3 FROM ".DATA_TABLE."111 GROUP BY name"; // 111 - id таблицы, заменить на реальный id

Во втором варианте ошибок еще больше.

#9 CbCoder

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

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

Отправлено 05 Июнь 2015 - 17:29

Да, и еще: зачем вы используете промежуточные переменные $m1, $m2, $m3? В этом есть какой-то сакральный смысл? Формально тут ошибки нет (код будет работать), но это бессмысленно с точки зрения логики. Все равно что, если вы захотите взять пирожок с полки, зачем-то вначале положите его на тарелку. Только тарелку зря запачкаете.

#10 ryskeldi

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

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

Отправлено 06 Июнь 2015 - 08:36

Извиняюсь, вы меня сильно не пеняйте, спасибо за подсказку, я исправлюсь!
Где "name", у меня на кириллице написано "Наименование".
$sqlQuery = "SELECT SUM(M1) as m1, SUM(M2) as m2, SUM(M3) as m3 FROM ".DATA_TABLE."111 GROUP BY 'Наименование', 'Индекс'";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$line['M1'] = $row['m1'];
$line['M2'] = $row['m2'];
$line['M3'] = $row['m3'];
Если группировка по нескольким одинаковым именем поля идет, те по "Наименование" и "Индекс", выше написанный код верно? Спасибо!

#11 CbCoder

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

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

Отправлено 08 Июнь 2015 - 09:18

Цитата

Где "name", у меня на кириллице написано "Наименование"

Кириллические имена в запрос вставлять нельзя, это имена, используемые в самой программе, а в БД используются другие имена, которые выглядят как "f111", где 111 - это id поля. Это касается всех полей, в том числе тех, которые у вас описаны как "m1" и т.д. Замените, иначе получите ошибку SQL.

Цитата

Если группировка по нескольким одинаковым именем поля идет, те по "Наименование" и "Индекс", выше написанный код верно?

Не совсем, бессмысленно группировать сразу по двум полям, если группировка по ним совпадает. Лишняя нагрузка только. По 2 полям группируют, если второе поле должно группироваться внутри первого. В вашем случае этого не требуется.

#12 ryskeldi

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

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

Отправлено 08 Июнь 2015 - 14:23

$sqlQuery = "SELECT SUM(f1233) as m1, SUM(f1234) as m2, SUM(f1235) as m3 FROM ".DATA_TABLE."111 GROUP BY 'f1230'";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$line['M1'] = $row['m1'];
$line['M2'] = $row['m2'];
$line['M3'] = $row['m3'];

Вот так написал, данный код одинаковые поля не группирует и ни какой результат не дает!

#13 CbCoder

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

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

Отправлено 08 Июнь 2015 - 18:25

GROUP BY 'f1230'" - вокруг названия поля кавычки не нужны, иначе БД воспринимает это как текстовое выражение, а не имя поля. Может использоваться "наклонная кавычка" (обратный апостроф), но она необходима когда имя конфликтует с оператором SQL, тут этого нет, поэтому сие излишне.

$sqlQuery = "SELECT SUM(f1233) as m1, SUM(f1234) as m2, SUM(f1235) as m3 FROM ".DATA_TABLE."111 GROUP BY f1230";


#14 ryskeldi

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

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

Отправлено 09 Июнь 2015 - 08:13

Спасибо, огромное, помогло!
Группирует по одинаковым значением (f1230).
Теперь мне нужно, чтобы одинаковые значения записались в одной строке. Как мне реализовать, помогите пожалуйста!

#15 CbCoder

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

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

Отправлено 09 Июнь 2015 - 09:10

А вам как именно их записать в одной строке? Через запятую?

#16 ryskeldi

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

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

Отправлено 09 Июнь 2015 - 09:20

Спасибо, за быстрый отклик.
Id index name M1 M2 M3
1 7201 D1 2 2 2
2 7202 D2 1 1 3
3 7201 D1 4 4 4
4 7204 D4 3 3 3
5 7201 D1 4 5 5
Результат должен быть:
1 7201 D1 7 9 11

#17 CbCoder

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

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

Отправлено 09 Июнь 2015 - 10:52

Так добавьте в вывод запроса и в код другие поля. У вас сейчас выводятся только M1 M2 M3.

#18 ryskeldi

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

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

Отправлено 09 Июнь 2015 - 11:42

Извините, не совсем понял,
$sqlQuery = "SELECT SUM(f1233) as m1, SUM(f1234) as m2, SUM(f1235) as m3 FROM ".DATA_TABLE."111 GROUP BY f1230";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$line['M1'] = $row['m1'];
$line['M2'] = $row['m2'];
$line['M3'] = $row['m3'];
$line['index'] = ?
$line['name'] = ?

#19 CbCoder

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

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

Отправлено 09 Июнь 2015 - 13:08

Во-первых, не index и name, а "Индекс" и "Наименование" (в $line это разрешено), либо внутренние имена БД (f111). Во-вторых, у вас этих полей нет в SELECT, добавьте вначале туда.

Должно быть что-то вроде:

$sqlQuery = "SELECT SUM(f1233) as m1, SUM(f1234) as m2, SUM(f1235) as m3, f111, f222 FROM ".DATA_TABLE."111 GROUP BY f1230";
$res = sql_query($sqlQuery);
$row = sql_fetch_array($res);
$line['M1'] = $row['m1'];
$line['M2'] = $row['m2'];
$line['M3'] = $row['m3'];
$line['Индекс'] = $row['f111'];
$line['Наименование'] = $row['f222'];

Вместо 111 и 222 подставьте реальные id полей.

#20 ryskeldi

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

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

Отправлено 09 Июнь 2015 - 14:55

Спасибо, пробую!





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

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