需要查询具有某些条件的JOIN四个表吗?

时间:2018-10-31 11:55:51

标签: sql mysqli

我有以下四个表:

1)mls_user 2)mls_category 3)bonus_point 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的cat值。

我为特定用户使用以下代码,但是当我

 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 :(得分:1)

计算积分(奖励积分除外)需要在mls_entrymls_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

输出不完全匹配,因为您在问题中的Santosh数据中可能有错字,否则问题中的预期输出中有错字。