Я разрабатываю проект, который является системой бронирования отелей.
Моя проблема в том, что я хочу, чтобы цикл каждый месяц, как 1, 2 января - февраль и так далее. Если его 1, то он получит всю строку, месяц 1 или январь, cout_created
столбцом cout_created
в таблице базы данных cout_created
и добавьте всю прибыль для каждой записи, поместив ее позже в массив следующим образом:
$monthlyreport = [
1 => 6000,
2 => 5000,
3 => 3000,
4 => 12000,
5 => 8000,
6 => 4000,
7 => 6000,
8 => 9000,
9 => 4000,
10 => 6000,
11 => 9000,
12 => 4000,
];
Это схема таблицы базы данных mySQL для строки примера:
Row Name Row Data
id 9
gst_id 1
cout_tin 2018-07-01
cout_tout 2018-07-02
cout_nodays 1
cout_single 1
cout_double 2
cout_family 1
cout_roombal 13000
cout_billbal 1120
cout_totalbal 14120
cout_downbal 6500
cout_result 7620
cout_created 2018-07-15 09:34:12
Я использую PHP с картой Codeigniter.
Что вам нужно сделать, это комбинировать запросы базы данных с простым циклом в PHP.
Во-первых, вы должны понять, как получить все значения за месяц. cout_created
- это поле timestamp/datetime. В MySQL вы можете получить данные с помощью запроса, подобного этому:
SELECT * FROM yourtable WHERE MONTH(cout_created) = XX
Используя этот запрос, в PHP вы пойдете на это:
// Initialize the array
$monthlyreport = array();
// For each month we are gonna do the same
for ($month = 1; $month <= 12; $month++) {
// We get the results with database library, changing the sql according to our needs.
$sql = "SELECT cout_result FROM yourtable WHERE MONTH(cout_created) = " . $month;
$query = $this->db->query($sql);
// The accum variable to sum all the profits.
$sum = 0;
// And foreach record, we sum the value to the actual one.
foreach($query->result() as $row) {
$sum = $sum + $row->cout_result;
}
// When finish, save the result on the array and start again.
$montlyreport[$month] = $sum;
}
Это был бы самый простой способ понять, как это сделать, но мы можем сделать это еще лучше. MySQL позволяет нам сделать то же самое, используя встроенную функцию SUM() непосредственно в MySQL, поэтому нам не нужно делать дополнительную обработку на PHP. Мы можем это сделать:
// Initialize the array
$monthlyreport = array();
// For each month we are gonna do the same
for ($month = 1; $month <= 12; $month++) {
// But now we will get sum of the values instead of each value
$sql = "SELECT SUM(cout_result) as profit FROM yourtable WHERE MONTH(cout_created) = " . $month;
$query = $this->db->query($sql);
// And just save the profit
$montlyreport[$month] = $query->row()->profit;
}
Я не тестировал его, так как у меня нет среды PHP для тестирования, но дайте мне знать, как это работает, и я соответствующим образом обновлю ответ.
EDIT: я пришел с другим решением, которое разрешило его только с одним запросом к базе данных, но это будет зависеть от производительности с размером вашей базы данных и количеством записей:
SELECT SUM(cout_result) as profit, MONTH(cout_created) as mymonth FROM yourtable GROUP BY MONTH(cout_created)
При этом вам просто нужно выполнить итерацию с помощью foreach
экономя каждую прибыль непосредственно mymonth
$sql = "SELECT SUM(cout_result) as profit, MONTH(cout_created) as mymonth FROM yourtable GROUP BY MONTH(cout_created)"
$query = $this->db->query($sql);
$monthlyreport = array();
foreach ($query->result() as $row) {
$monthlyreport[$row->mymonth] = $row->profit;
}
cout_created
?cout_tin
?cout_tout
? Это MySQL? MongoDB? Дайте больше подробностей об этом, и я постараюсь помочь вам. Если я так думаю, решение довольно простое.