Извеждане, групиране на резултати по - години, месеци, данни

Ticketa

Registered
Привет, опитвам се да изведа резултати(само за наличните месеци) в този ред:
- 2019
-- 03
---- издадена фактура №
---- издадена фактура №
---- общо за месеца
-- 08
---- издадена фактура №
---- издадена фактура №
---- издадена фактура №
---- издадена фактура №
---- общо за месеца
-- 09
---- издадена фактура №
---- издадена фактура №
---- издадена фактура №
---- общо за месеца

Стигнах до тук:
- 2019
-- 03
-- 08
-- 09

PHP:
<?php
$query = "SELECT * FROM `costs_expense` group by year, month";
$result = $mysqli->query($query);
$storage_array = array();
while($row = $result->fetch_assoc()) {
   $year = $row['year'];
   $month = $row['month'];
   $storage_array[$year][] = $month;
}
foreach ($storage_array as $year => $month_array){
   echo "<ul class='year'><li><a>{$year}</a>";
   foreach ($month_array as $month){
      echo "<ul class='months'><li><a>{$month}</a></li></ul>";

   }
   echo "</li></ul>";
}
?>

Само не успявам да ги изведа данните за всеки месец, например № фактура или ЕИК на фирма. Предложение от някой турист?

Таблица:
[sql]


CREATE TABLE `costs_expense` (
`costs_id` int(255) NOT NULL,
`data` datetime DEFAULT NULL,
`year` int(255) NOT NULL,
`month` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`contractor_id` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`eik` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
`vat` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`invoice` int(10) DEFAULT NULL,
`description` text COLLATE utf8_unicode_ci DEFAULT NULL,
`cash_or_bank` varchar(10) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`cat_id` int(255) DEFAULT NULL,
`amount` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
[/sql]
 
Код:
while($row = $result->fetch_assoc()) {
   $year = $row['year'];
   $month = $row['month'];
   $eik = $row['eik'];
   $storage_array[$year][$month][] = $eik;
}




foreach ($storage_array as $year){

   echo "<ul class='year'><li><a>{$year}</a>";

   foreach ($year as $month){

     echo "<ul class='months'><li><a>{$month}</a></li></ul>";
     
     echo "<ul class='eik'>";
     foreach($month as $eik) {
        echo "<li><a>{$eik}</a></li>";
    
    } 
    echo "</ul>";
  
   }

   echo "</li></ul>";

}

Некво такова може би?
 
Не работи, аз тествах преди това. Чупи се кода.
Код:
    Array
        Array
        123456789
        Array
        123456987
        Array
        123456879

Изчезва годината й месеца й на негово място пише Array

ЕДИТ:

Същност , реших проблема така:

Код:
<?php
$query = "SELECT * FROM `costs_expense` group by year, month";
$result = $mysqli->query($query);
$storage_array = array();
while($row = $result->fetch_assoc()) {
   $year = $row['year'];
   $month = $row['month'];
   $eik = $row['eik'];
   $storage_array[$year][$month][] = $row;
}

foreach ($storage_array as $year => $month_array){
    echo "<ul class='year'><li><a>Година: {$year}</a>";
    foreach ($month_array as $month => $data_array){
        echo "<ul class='months'><li><a>Месец: {$month}</a></li></ul>";
        foreach($data_array as $byYearRow) {
            
            $resultCatx = $mysqli->query("SELECT contractor_name FROM `contractors` WHERE contra_id=".$byYearRow['contractor_id']."") or trigger_error("Query Failed! SQL:  - Error: ".mysqli_error(), E_USER_ERROR);
            $rowCatx = $resultCatx->fetch_assoc();
            echo "<ul class='eik'><li><a>Фирма: ".$rowCatx['contractor_name'].", ЕИК: ".$byYearRow['eik']."</a></li></ul>";
        }
   }
   echo "</li></ul>";
}
?>


Обаче, не работи отново коректно. Имам за всеки месец повече от 1 запис , обаче кода изважда само по 1 запис, което е странно?
 
Ако dump-неш $storage_array веднага след while цикъла, виждаш ли всички данни правилно?
 
Много по-лесно ще е да научи SQL. Ама какво да се прави - в тоя форум глупостта е издигната на почит, а тоя пост ще бъде затрит щото не дава сдъвкано решение.

Айде дърпайте шаутера вече.
 
anonimen каза:
Ако dump-неш $storage_array веднага след while цикъла, виждаш ли всички данни правилно?
Не, извежда само 3 резултата - вчера го дебъгнах точно така, й за това писах че го имам като проблем.


Тоест самата заявка явно създава проблем, защото при изпълнение в PMA също изважда само три резултата. Може би не трябва да групирам й месеца?
 
Ако научиш SQL ще помогне.
Но във форум в който глупостта е издигната в култ подобни съвети не се толерират, нали?
 
Не трябва, защото ако имаш от 2017, 2018 и 2019 записи, и за трите години групираш по месец, ще ти изведе точно 3 записа.
 
С подобна заявка [sql]SELECT eik, count(*) as cnt,CONCAT(MONTH(data),'/', YEAR(data)) as day from costs_expense group by day [/sql]

Ми изкарва;

Код:
eik	cnt	day 	
123456789   10 	3/2019
123456799   1 	8/2019
123456889   7 	9/2019

Тоест, март месец има 10 записа(които не ги изкарва , а само 1 еик) , август има 1 запис, септември има 7 записа

Реших го така:
PHP:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

$query = "SELECT * FROM `costs_expense` ORDER BY `data` DESC";
$result = $mysqli->query($query);
$storage_array = array();
while($row = $result->fetch_assoc()) {
   $year = $row['year'];
   $month = $row['month'];
   $eik = $row['eik'];
   $storage_array[$year][$month][] = $row;
}
foreach ($storage_array as $year => $month_array){
    echo "<ul class='year'><li><a>Година: {$year}</a>";
    foreach ($month_array as $month => $data_array){
        echo "<ul class='months'><li><a>Месец: {$month}</a></li></ul>";
        foreach($data_array as $byYearRow) {
            
            $resultCatx = $mysqli->query("SELECT contractor_name FROM `contractors` WHERE contra_id=".$byYearRow['contractor_id']."") or trigger_error("Query Failed! SQL:  - Error: ".mysqli_error(), E_USER_ERROR);
            $rowCatx = $resultCatx->fetch_assoc();
            echo "<ul class='eik'><li><a>Фирма: ".$rowCatx['contractor_name'].", ЕИК: ".$byYearRow['eik']."</a></li></ul>";
        }
   }
   echo "</li></ul>";
}
?>
 
Ама ти, ако искаш всички записи, не трябва да групираш по нищо или аз не разбирам какво точно се опитваш да направиш.

Дай примерни 20 записа с различни данни (година, месец, ден, ЕИК и т.н.) и кажи какво очакваш като резултат.
 

Горе