Нужен запрос для соединения четырех таблиц с некоторыми условиями? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть следующие четыре таблицы:

1) mls_user 2) mls_category 3) бонус_пункт 4) mls_entry

В таблице mls_user значения указаны ниже:

*-------------------------*
| id | store_id | name    |
*-------------------------*
| 1  |    101   | sandeep |
| 2  |    101   | gagan   |
| 3  |    102   | santosh |
| 4  |    103   | manu    |
| 5  |    101   | jagveer |
*-------------------------*

В таблице mls_category значения указаны ниже:

*---------------------------------*
| cat_no |  store_id |  cat_value |
*---------------------------------*
|   20   |   101     |     1      |
|   21   |   101     |     4      |
|   30   |   102     |     1      |
|   31   |   102     |     2      |
|   40   |   103     |     1      |
|   41   |   103     |     1      |
*---------------------------------*

В таблице bonus_point значения указаны ниже:

*-----------------------------------*
| user_id | store_id |  bonus_point |
|   1     |   101    |     10       |
|   4     |   101    |      5       |
*-----------------------------------*

В таблице mls_entry значения указаны ниже:

*-------------------------------------------------------*
| user_id | store_id |  category |  distance |  status  |
*-------------------------------------------------------*
|    1    |   101    |    20     |    10     | Approved |
|    1    |   101    |    21     |    40     | Approved |
|    1    |   101    |    20     |    10     | Approved |
|    2    |   101    |    20     |     5     | Approved |
|    3    |   102    |    30     |    10     | Approved |
|    3    |   102    |    31     |    80     | Approved |
|    4    |   101    |    20     |    15     | Approved |
*-------------------------------------------------------*

И я хочу вывод ниже:

*--------------------------------------------------*
|  user name  | Points | bonus Point | Total Point |    
*--------------------------------------------------*
|   Sandeep   |   30   |     10      |    40       |
|   Santosh   |   30   |     0       |    30       |
|   Manu      |   15   |     5       |    20       |
|   Gagan     |   5    |     0       |     5       |
|   Jagveer   |   0    |     0       |    0        |
*--------------------------------------------------*

Я расскажу расчет того, как начнутся баллы для пользователя Sandeep. Очки = ((10 + 10) / 1 + 40/4) = 30 Здесь 1 и 4 - значение кота, полученное из mls_category.

Я использую приведенный ниже код для конкретного пользователя, но когда я

 SELECT sum(t1.totald/c.cat_value) as total_distance 
     FROM mls_category c 
       join (
         select sum(distance) totald, user_id, category 
           FROM mls_entry 
           WHERE user_id=1 AND store_id='101' AND status='approved' 
           group by user_id, category) t1 on c.cat_no = t1.category

Я создал таблицы в Интернете для проверки DEMO

1 Ответ

0 голосов
/ 31 октября 2018

Для вычисления баллов (кроме бонусных баллов) требуется отдельное объединение таблиц mls_entry и mls_category. Я хотел бы сделать это в отдельном подзапросе, а затем присоединить его к большему запросу.

Вот один из подходов:

SELECT
    u.name,
    COALESCE(t1.points, 0) AS points,
    COALESCE(b.bonus_point, 0) AS bonus_points,
    COALESCE(t1.points, 0) + COALESCE(b.bonus_point, 0) AS total_points
FROM mls_user u
LEFT JOIN
(
    SELECT e.user_id, SUM(e.distance / c.cat_value) AS points
    FROM mls_entry e
    INNER JOIN mls_category c
        ON e.store_id = c.store_id AND e.category = c.cat_no
    GROUP BY e.user_id
) t1
    ON u.id = t1.user_id
LEFT JOIN bonus_point b
    ON u.id = b.user_id
ORDER BY
    total_points DESC;

Это вывод, который я получаю из приведенного выше запроса в демоверсии, которую вы настроили:

enter image description here

Вывод не соответствует точно, потому что у вас (возможно) опечатка в данных Сантоша в вашем вопросе, или в противном случае ожидаемый вывод в вашем вопросе имеет опечатку.

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