Как объединить две таблицы, а затем отобразить суммарное значение каждого из данных таблицы, собранной из другой таблицы - PullRequest
3 голосов
/ 27 декабря 2011

Прежде всего, извините, если название моего вопроса звучит глупо .... У меня есть следующие таблицы.Первая таблица содержит название типа моих расходов, а вторая таблица содержит информацию о сумме и дате этих расходов.Если вы заметили вторую таблицу ниже, есть поле с именем «e_id», которое соответствует значению идентификатора моих расходов из первой таблицы.

Имя первой таблицы: расход_тип

  id     expense_name 

  1        Insurance
  2        Interest Payment
  3        Rent
  4        Electricity

 ... and goes on like this (unlimited perhaps :))

Имя второй таблицы: расход_детали

 id       e_id    amount       date

  1        3      1000        2011-12-11 
  2        1       500        2011-12-19 
  3        4        10        2011-11-21
  4        3      1000        2012-01-12

... and goes on like this )

Теперь я планирую получить все значения из этих двух таблиц и сгенерироватьрезультат вроде следующего.Но поскольку первая таблица содержит неизвестное количество информации (для меня), я не знаю, как написать запрос (как php, так и mysql) для получения такого результата.

Скажите, пожалуйста, помогите мне, какдостичь этого?

Заранее спасибо:)

PS только для вашей информации, я использую Codeigniter.

                                 **For the Month: January 2011**


           Insurance    :  1000

           Rent         :  3453

           Electricity  :   546

      Interest Payment  :   546    
  ---------------------------------
      **Total Expenses**: 938949 /// this value is just for an example

Ответы [ 3 ]

4 голосов
/ 27 декабря 2011

Вы можете использовать

SELECT expense_name, SUM(amount) as monthly_total
FROM expense_details, expense_type
WHERE expense_type.id=expense_details.e_id
  AND `date` >= '2011-01-01' 
  AND `date` <  '2011-02-01'  
GROUP BY expense_details.e_id;

, а затем форматировать по своему желанию.Обратите внимание, что date находится в обратном кавычках, так как это также функция в MySQL.

Чтобы изменить месяц, просто сделайте `date> = 'гггг-мм-01' И date <'гггг- (мм+1) -01 '<code>(unless мм` - декабрь ...).

Вы также можете сделать

WHERE MONTH(`date`)=1 AND YEAR(`date`)=2011, 

или

WHERE `date`>='yyyy-mm-dd' AND `date`<DATE_ADD('yyyy-mm-dd',INTERVAL 1 MONTH)

за январь 2011 г.(посмотрите здесь ), но я считаю, что это немного медленнее, если у вас нет индексированной даты (конечно, какой метод вы выберете, зависит от ожидаемого количества записей, которые вы просматриваете, какбаза данных настроена и т. д. и т. д., но почему бы не попробовать несколько версий и посмотреть, что вам подходит?)

0 голосов
/ 27 декабря 2011
SELECT ed.e_id, DATE_FORMAT(ed.date, '%M %Y') AS `month`, et.expense_name, SUM(ed.amount) AS `amount`
FROM expense_details ed
  INNER JOIN expense_types et ON (et.id = ed.e_id)
WHERE (ed.date BETWEEN '2011-11-01' AND DATE_ADD('2011-11-01', INTERVAL 3 MONTH))
GROUP BY `month`, ed.e_id
WITH ROLLUP

Вы можете установить любой диапазон дат, конечно, возможно, даже один месяц, или вообще не указывать дату, чтобы получить полный отчет. Он будет суммировать расходы для каждого типа со сводкой каждый месяц (у вас будет заполнено month и ed.e_id = NULL - таким образом вы узнаете, что это сумма за месяц), а затем на полный рабочий день (как month, так и ed.e_id). = NULL).

Вывод будет таким:

e_id    month           expense_name    amount  
1       December 2011   Insurance       500
3       December 2011   Rent            1000
NULL    December 2011   Rent            1500
3       January 2012    Rent            1000
NULL    January 2012    Rent            1000
4       November 2011   Electricity     10
NULL    November 2011   Electricity     10
NULL    NULL            Electricity     2510

Конечно, вы должны игнорировать липкий expense_name, когда видите e_id = NULL

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

Конечно, SQl вознаградит вас еще большей производительностью, если у вас правильно настроены внешние ключи (поэтому JOIN будет работать быстрее, чем просто выбрать из двух таблиц и добавить id=e_id в предложении WHERE) и индексировать поле date .

0 голосов
/ 27 декабря 2011

Вы можете сделать это в контроллере или модели:

$sql = "SELECT a.*, b.expense_name FROM expense_details AS a, expense_name AS b WHERE a.e_id = b.id ORDER BY a.id ASC";
$data = $this->db->query($sql)->result_array();
$totals = array();

echo '**For the Month: January 2011**';
echo "\n\n";

foreach ($data as $item){
  $totals[$item['expense_name']] = isset($totals[$item['expense_name']]) ? $totals[$item['expense_name']] + $item['amount'] : $item['amount']: 
}

foreach ($totals as $name => $val){
  echo $name.': '.$val;
  echo "\n\n";
}

Не самый элегантный или стабильный метод, но я надеюсь, что это поможет вам понять, что вам нужно делать. Возможно, вы также захотите подвести итоги по месяцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...