Есть ли способ оптимизировать этот запрос MySQL ...? - PullRequest
0 голосов
/ 31 марта 2010

Скажите, у меня есть эти две таблицы ....

Table 1 : Hotels
   hotel_id   hotel_name
       1          abc
       2          xyz
       3          efg

Table 2 : Payments
    payment_id     payment_date     hotel_id     total_amt    comission
       p1           23-03-2010          1          100           10
       p2           23-03-2010          2          50            5
       p3           23-03-2010          2          200           25
       p4           23-03-2010          1          40            2

Теперь мне нужно получить следующие данные из двух таблиц

  1. Учитывая конкретную дату (скажем, 23-03-2010), сумму total_amt для каждого отеля, за который был произведен платеж в эту конкретную дату.
  2. Все строки с датой 23-03-2010 упорядочены по названию отеля

Пример вывода выглядит следующим образом ...

+------------+------------+------------+---------------+
| hotel_name |   date     |  total_amt |   commission  |
+------------+------------+------------+---------------+
| * abc      | 23-03-2010 |     140    |      12       |
+------------+------------+------------+---------------+
|+-----------+------------+------------+--------------+|
|| paymt_id  |   date     |  total_amt |   commission ||
|+-----------+------------+------------+--------------+|
||   p1      | 23-03-2010 |     100    |     10       ||
|+-----------+------------+------------+--------------+|
||   p4      | 23-03-2010 |     40     |     2        ||
|+-----------+------------+------------+--------------+|
+------------+------------+------------+---------------+
| * xyz      | 23-03-2010 |     250    |      30       |
+------------+------------+------------+---------------+
|+-----------+------------+------------+--------------+|
|| paymt_id  |   date     |  total_amt |   commission ||
|+-----------+------------+------------+--------------+|
||   p2      | 23-03-2010 |     50     |      5       ||
|+-----------+------------+------------+--------------+|
||   p3      | 23-03-2010 |     200    |      25      ||
|+-----------+------------+------------+--------------+|
+------------------------------------------------------+

Над образцом таблицы, которая должна быть напечатана ...

Идея состоит в том, чтобы сначала показать консолидированную информацию о каждом отеле, а когда нажимается '*' рядом с названием отеля, становится видна разбивка платежных реквизитов ... Но это можно сделать с помощью некоторых jquery. . !!! Сама таблица может быть сгенерирована с помощью php ...

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

Есть ли способ объединить эти два запроса в один и выполнить операцию более оптимизированным способом ... ??

Надеюсь, я проясню .. Спасибо за ваше время и ответы ...

РЕДАКТИРОВАТЬ: добавлены запросы слишком

  1. Запрос на получение суммы ()

     <code>
    SELECT DATE_FORMAT($payments.payment_date, '%d-%m-%Y %T') as payment_date,
            $payments.payment_id AS payment_id,
            $payments.payment_amount AS payment_amount,
            $payments.agent_commision AS commision,
            $payments.comm_percentage AS percentage,
            $hotels.hotel_name AS hotel
            SUM($payments.payment_amount)  AS tot_amt
            SUM($payments.agent_commision) AS tot_ag_comsn
    FROM $payments
    JOIN $hotels
    ON   $payments.hotel_id = $hotels.hotel_id
    WHERE DATE_FORMAT(payment_date,'%d-%m-%Y') = '$date_report'
    GROUP BY $payments.hotel_id
    ORDER BY $payments.payment_date ASC 
    
  2. Запрос на получение отдельных строк

     
    SELECT DATE_FORMAT($payments.payment_date, '%d-%m-%Y %T') as payment_date,
                $payments.payment_id AS payment_id,
                $payments.payment_amount AS payment_amount,
                $payments.agent_commision AS commision,
                $payments.comm_percentage AS percentage,
                $hotels.hotel_name AS hotel
    FROM $payments
    JOIN $hotels
    ON   $payments.hotel_id = $hotels.hotel_id
    WHERE DATE_FORMAT(payment_date,'%d-%m-%Y') = '$date_report'
    GROUP BY $payments.payment_date
    ORDER BY $payments.payment_date ASC
     

    Я добавляю строки, возвращенные двумя запросами, в две отдельные временные таблицы, а затем использую php для печати таблицы, как показано выше ...

РЕДАКТИРОВАТЬ 2: И также, спасибо, если кто-то предложит лучший заголовок для этого поста ...;)

1 Ответ

0 голосов
/ 31 марта 2010

Это область авторов отчетов или эквивалентная логика в языке программирования.

...