У меня возникла проблема с извлечением записей mysql. То, что я пытаюсь достичь, состоит в том, чтобы выполнить mysql-запрос один или два раза дважды, сохранить результаты в массиве, а затем выполнить цикл через массив, используя foreach, чтобы сохранить результат, как указано ниже.
Моя основная таблица базы данных (partner_redirect) имеет тысячи таких записей:
id member partnerid Status datePost 1 87887 1 1 2014-08-09 2 988 3 0 2014-08-09 3 4545 1 1 2014-08-09 4 8892 5 0 2014-08-09 5 8891 5 0 2014-08-09 6 8894 5 0 2014-08-09 7 889 5 0 2014-08-02 8 2341 3 1 2014-08-09 9 8893 1 0 2014-08-01 10 23224 3 1 2014-08-01 11 88913 5 0 2014-08-03 12 2324 3 0 2014-08-04
………………………………………….. ………………… ……………………….. ……………………………………
Вот мой код:
db.class.php
class Database { .............................. ........................ #-############################################# # desc: returns all the results (not one row) # param: (MySQL query) the query to run on server # returns: assoc array of ALL fetched results public function fetch_all_array($sql) { $query_id = $this->query($sql); $out = array(); while ($row = $this->fetch_array($query_id)) { $out[] = $row; } $this->free_result($query_id); return $out; }#-#fetch_all_array() }
Реализация:
include_once ('Database.class.php'); $sql="select id,name from partner "; $col=$db->fetch_all_array($sql); foreach($col as $part) { $id=$part['id']; $name=$part['name']; $sql ="select partnerid,datePost as date ,Status from partner_redirect_link where partnerID=".$id; $partner_redirect=$db->fetch_all_array($sql); foreach($partner_redirect as $part_red) { $data['id']=$part_red['partnerID']; $data['date']=$part_red['date']; if(isset($previous) &&($previous!=$part_red['date'])) { while($previous==$part_red['date']) { $redirected=$part_red['redirectedStatus']; #if redirected status =0 then if ($redirected==0) { $totalNotredirect=$totalNotredirect+1; $data['totalNotredirect']=$totalNotredirect; #$data['totalredirect']=0; }else{# if 1 $totalredirected=$totalredirected+1; $data['totalredirect']=$totalredirected; #$data['totalredirect']=0; } } }else{ $previous=$data['date']; $redirected=$part_red['redirectedStatus']; #if redirected status =0 then if ($redirected==0) { $totalNotredirect=$totalNotredirect+1; $data['totalNotredirect']=$totalNotredirect; #$data['totalredirect']=0; }else{# if 1 $totalredirected=$totalredirected+1; $data['totalredirect']=$totalredirected; #$data['totalredirect']=0; } $data['date']=$previous; $date[]=$previous; } } }
вinclude_once ('Database.class.php'); $sql="select id,name from partner "; $col=$db->fetch_all_array($sql); foreach($col as $part) { $id=$part['id']; $name=$part['name']; $sql ="select partnerid,datePost as date ,Status from partner_redirect_link where partnerID=".$id; $partner_redirect=$db->fetch_all_array($sql); foreach($partner_redirect as $part_red) { $data['id']=$part_red['partnerID']; $data['date']=$part_red['date']; if(isset($previous) &&($previous!=$part_red['date'])) { while($previous==$part_red['date']) { $redirected=$part_red['redirectedStatus']; #if redirected status =0 then if ($redirected==0) { $totalNotredirect=$totalNotredirect+1; $data['totalNotredirect']=$totalNotredirect; #$data['totalredirect']=0; }else{# if 1 $totalredirected=$totalredirected+1; $data['totalredirect']=$totalredirected; #$data['totalredirect']=0; } } }else{ $previous=$data['date']; $redirected=$part_red['redirectedStatus']; #if redirected status =0 then if ($redirected==0) { $totalNotredirect=$totalNotredirect+1; $data['totalNotredirect']=$totalNotredirect; #$data['totalredirect']=0; }else{# if 1 $totalredirected=$totalredirected+1; $data['totalredirect']=$totalredirected; #$data['totalredirect']=0; } $data['date']=$previous; $date[]=$previous; } } }
Я пытаюсь хранить данные, но я не знаю, как я могу соответствовать и считать каждую запись, сохраняя / сравнивая каждую дату в массиве.
Все, что я хочу показать результаты, выполнив два запроса, используя foreach следующим образом:
Date Partner TotalRecords(per partner) count(status=1) count(status=0) 2014-08-09 1 2 2 0 2014-08-09 3 2 1 1 2014-08-09 5 3 0 3 2014-08-04 3 1 0 1 2014-08-03 5 1 0 1 2014-08-01 1 1 0 1 2014-08-01 3 1 1 1
ОБНОВИТЬ:
Все, что я хочу получить данные из базы данных, выполняя запросы за минимальное количество раз, чтобы он не замедлял мою огромную онлайн-базу данных. Моя идея заключалась в том, чтобы сделать один или два запроса mysql получить все результаты, а затем отобразить записи в соответствии с вышеизложенным упомянутый желаемый результат, но я не смог этого достичь! Есть ли в любом случае я мог бы достичь этого ????
Буду признателен за вашу помощь в этом отношении.
Вместо PHP я бы рекомендовал использовать SQL для выполнения всего этого тяжелого подъема. И это требует только одного запроса.
Основываясь на желаемом выводе таблицы из 5 столбцов, следующий запрос SQL выполняет трюк. Я тестировал его в своем локальном поле с данными, которые вы предоставили. Столбец даты может быть опущен, так как вы не знаете, из какой строки действительно исходит дата.
select datePost, partnerid, count(*) as `partner_totalrecords`, sum(case when `status` = 0 then 1 else 0 end) `count_status_0`, sum(case when `status` = 1 then 1 else 0 end) `count_status_1` from partner_redirect group by partnerid;
Благодаря этому SO ответьте, как получить две колонки состояния. Я не знал, как это сделать до сих пор. Аккуратный трюк.
Из этого запроса у вас теперь есть простая плоская таблица для вывода. Простите краткость, но я думаю, что это имеет смысл.
$rows=$db->fetch_all_array($sql); foreach($rows as $row) { var_dump($row); }