Как объединить записи таблицы с некоторым условием в таблице SQL? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть шесть таблиц в базе данных, все таблицы относятся друг к другу и хочу показать записи в одной таблице.

Ниже приведены мои таблицы:

1) mls_stores

*----------------------------*
|   store_id |  store_title  |
*----------------------------*
|     1001   |  ajmar-jaipur |
|     1002   |  dwarka-delhi |
*----------------------------*

2) mls_category

*-------------------------------------------*
 | cat_no | store_id |  cat_value | cat_type |
 *-------------------------------------------*
 |  20    |   1001   |     1      | running  |
 |  21    |   1001   |     4      | cycling  |
 |  22    |   1002   |     1      | running  |
 |  23    |   1002   |     2      | swmining |
 *-------------------------------------------*

3) mls_points_matrix

*----------------------------------------*
| store_id | value_per_point |  maxpoint |
*----------------------------------------*
|   1001   |       1         |    10     |
|   1001   |       2         |    20     |
|   1002   |       1         |    20     |
|   1002   |       4         |    30     |
*----------------------------------------*

4) mls_user

*--------------------------*
| id |  store_id |  name   |
*--------------------------*
|  1 |  1001     | sandeep |
|  2 |  1001     | jagveer |
|  3 |  1002     | gagan   |
*--------------------------*

5) бонусных очков

   *---------------------------------------------------*
   | user_id |  store_id |  bonus_points |  bonus_type |
   *---------------------------------------------------*
   |    1    |    1001   |     10        |   fixed     |
   |    3    |    1002   |      2        |     %       |
   *---------------------------------------------------*

6) mls_entry

*-------------------------------------------------------*
| user_id | store_id |  category |  distance |  status  |
*-------------------------------------------------------*
|   1     |   1001   |    20     |    10     | approved |
|   1     |   1001   |    21     |    40     | approved | 
|   1     |   1001   |    20     |     5     | reject   | 
|   2     |   1001   |    21     |    40     | approved | 
|   3     |   1002   |    22     |    10     | approved | 
|   3     |   1002   |    23     |    20     | approved |
*-------------------------------------------------------*

Теперь я хочу вывод, как показано ниже:

*-----------------------------------------------------------------------------------*
| Name    |  Entries   | Points Earned | Bonus Points | Total Points | Total Amount |
*-----------------------------------------------------------------------------------*
| Sandeep | running(1) |       20      |      10      |     30       |     60       |
|         | cycling(1) |               |              |              |              |    
*-----------------------------------------------------------------------------------*
| Jagveer | cycling(1) |       10      |      0       |     10       |     10       |    
*-----------------------------------------------------------------------------------*  

Я использую следующий код:

SELECT
    u.name,
    ROUND(COALESCE(t1.points, 0)) AS points,
    ROUND(COALESCE(b.bonus_points, 0)) AS bonus_points,
    ROUND(COALESCE(t1.points, 0) + COALESCE(b.bonus_points, 0)) AS total_points
FROM mls_user u
LEFT JOIN
(
    SELECT e.user_id, e.status, 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
    HAVING e.status='approved'
) t1
    ON u.id = t1.user_id
LEFT JOIN bonus_points b
    ON u.id = b.user_id
WHERE u.store_id = '1001'
ORDER BY
    total_points DESC

Этот SQL-запрос дает мне заработанные баллы, бонусные баллы и общее количество баллов, но я не могу найти записи и общую сумму, и он дает мне неверный расчет баллов для Sandeep, согласно данным одна запись отклонена. так должно быть 20, а не 25.

Моя общая сумма будет для Sandeep 30X2 (она исходит из точечной матрицы) = 60 так же, как для jagveer, общая сумма для jagveer 10X1 = 10.

Я создал таблицы в DEMO

1 Ответ

0 голосов
/ 02 ноября 2018

Попробуйте ниже:

SELECT
    u.name,
    ROUND(COALESCE(t1.points, 0)) AS points,
    ROUND(COALESCE(b.bonus_points, 0)) AS bonus_points,
    ROUND(COALESCE(t1.points, 0) + COALESCE(b.bonus_points, 0)) AS total_points,
    ROUND(COALESCE(t1.points, 0) + COALESCE(b.bonus_points, 0)) * t1.countId as total_amount,
    group_concat(t1.EntriesConcat) as Entries

FROM mls_user u
LEFT JOIN
(
    SELECT e.user_id, e.status, SUM(e.distance / c.cat_value) AS points,
    concat(c.cat_type, '(',count(e.user_id), ')' ) as EntriesConcat,
    count(e.user_id) as countId -- it returns count of records according to group by part
    FROM mls_entry e
        INNER JOIN mls_category c
            ON e.store_id = c.store_id AND e.category = c.cat_no
    -- remove HAVING and use WHERE clause
    WHERE e.status='approved'
    GROUP BY e.user_id
) t1 ON u.id = t1.user_id
LEFT JOIN bonus_points b ON u.id = b.user_id
WHERE u.store_id = '1001'
ORDER BY total_points DESC
  • group_concat mysql полезен для объединения значений на Group By
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...