Подсчет значений в массиве из БД

Dmit

Добрый день.
Итак, имеется таблица БД MySQL куда записываются данные о количестве регистраций каждого работника на рабочем месте.
Таблица
user_id | num_reg
33 2
34 2
35 2
36 2
37 1
38 2
39 2
Задача — посчитать количество регистраций со значением «2», которые идут подряд, т.е. должно получиться значение 4,

Код (Text):
  1.  
  2. //Подключение к БД
  3. $user=»root»;
  4. $pass=»pass;»;
  5. $dbh = new PDO(‘mysql:host=localhost;dbname=database’, $user, $pass);
  6.  
  7. //Запрос к БД
  8. $sth = $dbh->prepare(«SELECT `num_reg` FROM `table`»);
  9. $sth->execute();
  10. $data = $sth->fetchAll(PDO::FETCH_ASSOC);
  11.  
  12. //Попытка посчитать количество в цикле
  13. $i = 0;
  14. $n = 2;
  15. foreach ($data as $data) {
  16.    if($data != $n) {
  17.       break;
  18.    }
  19.    else {
  20.        $i++;
  21.         }
  22.     }
  23.     echo $i;

Но, в результате выводится «0».:(

Дополнение. Если в если в запрос к БД добавить например «WHERE USER_ID = 33» и в переменную $data выводить не все значения (fetchAll), а одно (fetch), то считает правильно, но, соответственно, только одно значение.
Где то недопонимаю с массивом…

 

ADSoft

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

понятиями «идут подряд» итд как правило в БД не оперируют. Вы объясните тайный смысл по человечески? Зачем это?

в вашем же примере например есть и другое кол-во регистраций подряд с 2 — это 38,39, почему оно не подходит?

 

Androbim

Код (Text):
  1. foreach ($data as $data)

а так можно?

Далее не читал.

 

Drunkenmunky

1. Почему именно PDO?
2. Почему именно подготовленный запрос?
3. Просматривалась ли выдача прежде, чем к ней применялись какие-то действия?

Одни вопросы.

 

Taktreba

@Dmit или переформулируй задачу, что бы можно было правильно составить sql запрос, или выведи все сразу а в php уже в foreach делай что тебе нужно, так как замечание «в вашем же примере например есть и другое кол-во регистраций подряд с 2 — это 38,39, почему оно не подходит?» очень правильное.

 

Dmit

Отвечу сразу всем.

Оперируют и еще как! Вы, видимо, никогда не работали на крупном предприятии. Там еще и не такие понятия бывают. Смысл не могу объяснить, т.к. мне начальство не озвучило в чем смысл и цель задачи).

Потому что значение 37 — 1, соответственно прерывает серию.

Прикинь, можно:). Не знаю как в РНР, я в нем не крупный спец, а в других языках это называется переопределение переменной, что бы не плодить лишние сущности.

1. Потому что таковы требования безопасности запросов к БД на РНР, разве нет?
2. Таковы рекомендации PDO в официальной документации.
И в конце выкладываю вполне рабочий код, который написал покопавшись в документации. Может кому пригодится). Спасибо за помощь. Отличное у вас сообщество РНР-программистов:D.
Рабочий код

Код (Text):
  1. <?php
  2. $sth = $dbh->prepare(«SELECT * FROM `table_name`»);
  3. $sth->execute();
  4. $data = $sth->fetchAll(PDO::FETCH_ASSOC);
  5. $i = 0;
  6. $n = 2;
  7. foreach($data as $data) {
  8.         if($data[‘num_reg’] != $n) {
  9.             break;
  10.         }
  11.         else {
  12.             $i++;
  13.         }
  14.     }
  15.     echo $i;
  16. ?>
 

Drunkenmunky

Ну-да, ну-да.

Нет. Где вы все это всё-время вычитываете?
Какой-то мега-гуру на первых позициях в поиске Гугла всплывает?
Зачем использовать универсальный инструмент, если есть простой, доступный, но специальный?
Вы работаете сразу с несколькими базами данных от разных поставщиков?
Только в этом случае это как-то оправдано.

 

Dmit

Ну тут не знаю. Что прочитал, то и говорю). Не занимаюсь РНР профессионально, потому тут ничего сказать не могу. Кстати, как-то спрашивал что-то по запросу к БД, где запрос был написан без PDO, так меня местные гуру закидали какашками)

 

Drunkenmunky

Это всё объясняет.
Не расстраивайтесь. Спорить с такими тоже не надо.
Одержимость тоже можно ловко использовать.

 

ADSoft

Крупное, не крупное .. какая разница. Если имеется ввиду — чем крупнее — тем больше бреда — то да, слава богу не работал.

Теперь по существу, почему такой вопросы возникли…
1) у вас обычная выборка — без указания сортировки, в произвольном случае БД имеет право отдавать в произвольном порядке, да, чаще всего будет отдавать с сортировкой по id — но это не факт. То есть два одинаковых запроса могут вам отдать данные в разном порядке — если не указана явно сортировка. это в любой БД, на любом предприятии.
2) Ладно. примем что п 1 не знаем и нам БД всегда в нужном нам порядке отдает. Тогда в формулировке задачи должно быть уточнение — найти длину первой серии данных с такими-то условиями
3) $data AS $data — да можно, но как правило не нужно, для той-же удобочитаемости, и исключения ошибок, не дай бог потом в самом же цикле захотите этой переменной что-то присваивать… экономия на выделении памяти под переменные — давно в прошлом.
4) PDO/не PDO на самом деле не так уж тут и важно, для вас это просто инструмент получения данных из БД
5) делать то что «начальство» сказала — не всегда гуд, надо попытаться выяснить саму суть задачи, в вашем случае в 99.9% есть более правильное, красивое решение, и скорее всего средствами SQL … ну и если все же учесть п 1., то в один прекрасный день у вас все пойдет не по плану)))

то что вы иронизируете над сообществом — ваше право, но я увидел у участников именно желание понять суть задачи, для грамотного решения вопроса…

 

artoodetoo

можно найти примеры по контексту «sql streak length«
что важно:
— сформулировать задачу не подразумевая свой собственный путь решения («массив из бд»)
— в запросе явно указать сортировку. не полагаться на некий «порядок по умолчанию» — его нет
— стараться доверить обработку множеств серверу БД, а не вытягивать все данные на сторону PHP — так будет неэффективно, возможно даже будет валиться по нехватке памяти
— Добавлено —
задача сведется к написанию SQL запроса, если она будет нормально сформулирована.

 

Evgenii_web

сегодня столкнулся с этой проблемой, решение = ввести переменную новую массива, в цикле запихнуть туда массив базы, получаем пронумерованный двухуровневый массив.
если не понятно могу дать свой код (ну это мое решение было возможно и как то по другому решается, я же новичок) Тем более у меня не большие региональные двухуровневые массивы, а так нужно понимать можно упереться в память. Хотя у меня не подходит к Вашей теме.

 

mkramer

Да, столкнулся с этим при переходе с MySQL на PostgreSQL. Если MySQL отдаёт в порядке добавления при отсутствии сортировки, то PostgreSQL — по времени последнего обновления. И всё туда/сюда скачет сразу

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *