繁体   English   中英

LEFT JOIN之后的MySQL查询计算问题

[英]MySQL query calculation problem after LEFT JOIN

我从那里有两个表user_point_logsuser_point_used_logs我想得到这样的输出

╔══════╦═════╦══════════════════════╦═══════════════════════╗══════════════╗
║ year ║month║ user_next_expire_date║ user_point_next_expire║minus         ║
╠══════╬═════╬══════════════════════╬═══════════════════════╣══════════════╣
║2018  ║ 10  ║ 2018年10月27日        ║ 200                   ║110          ║
║      ║     ║                      ║                       ║              ║ 
╚══════╩═════╩══════════════════════╩═══════════════════════╝══════════════╝

这是关系user_point_logs.return_id = user_point_used_logs.id和user_point_used_logs.user_point_log_used_id = user_point_logs.id

user_point_logs

╔════╦════════╦═════╦═══════════╦══════════╗
║ id ║user_id ║point║expire_date║return_id ║
╠════╬════════╬═════╬═══════════╬══════════╣
║  1 ║ 16087  ║ 100 ║1540649153 ║   null   ║
║  2 ║ 16087  ║ 100 ║ null      ║   1      ║
║  3 ║ 16087  ║ 10  ║ null      ║   2      ║
║  4 ║ 16087  ║ 100 ║ 1540649153║   null   ║ 
╚════╩════════╩═════╩═══════════╩══════════╝

user_point_used_logs

|-------|-----------------------|-----------------------|------|
| Id    | user_point_log_id     | user_point_log_used_id| point|
|-------|-----------------------|-----------------------|------|
| 1     |         2             |         2             | 100  |
|-------|-----------------------|-----------------------|------|
| 2     |         3             |         3             | 10   |
|-------|-----------------------|-----------------------|------|

我只是尝试放置一些示例数据。 这是我的查询。

SELECT 
  YEAR(FROM_UNIXTIME(user_point_logs.expire_date, '%Y-%m-%d')) AS year, 
  MONTH(FROM_UNIXTIME(user_point_logs.expire_date, '%Y-%m-%d')) AS month, 
  FROM_UNIXTIME(
    SUBSTRING_INDEX(
      GROUP_CONCAT(
        DISTINCT user_point_logs.expire_date ORDER BY user_point_logs.expire_date ASC
        SEPARATOR ','
      ), 
      ',', 
      1
    ), 
    '%Y年%m月%d日'
  ) AS user_next_expire_date, 
  SUM(user_point_logs.point) AS user_point_next_expire, 
  IF(
    SUM(`user_point_used_logs`.`point`) IS NULL, 
    0, 
    SUM(`user_point_used_logs`.`point`) 
  ) AS `minus` 
FROM `user_point_logs` 
LEFT JOIN (
  SELECT *
  FROM user_point_used_logs
  WHERE user_point_log_id NOT IN (
    SELECT DISTINCT return_id
    FROM user_point_logs
    WHERE return_id IS NOT NULL
  )
) AS user_point_used_logs 
ON (`user_point_logs`.`id` = `user_point_used_logs`.`user_point_log_used_id`) 
WHERE `user_point_logs`.`user_id` = '16087' 
AND `user_point_logs`.`point` > 0
AND `user_point_logs`.`expire_date` > 1540464465 
AND (
  `user_point_logs`.`return_id` = 0 OR 
  `user_point_logs`.`return_id` IS NULL
)
GROUP BY `year`, `month`

问题在于,有时剩余点和减去点的计算没有得到实际结果。 在我的小提琴中,您将看到user_point_next_expire 200但减0。但是减应为100。

请告诉我查询中是否有错误。

这是我的样本数据集...

CREATE TABLE user_point_logs (
  id          int NOT NULL,
  user_id     int NOT NULL,
  point       int(11) NOT NULL,
  expire_date int DEFAULT NULL,
  return_id   int DEFAULT NULL
);

CREATE TABLE user_point_used_logs (
  id                      int NOT NULL,
  user_point_log_id       int NOT NULL,
  user_point_log_used_id  int DEFAULT '0' ,
  point                   int NOT NULL 
);

INSERT INTO user_point_used_logs 
  (id,  user_point_log_id,  user_point_log_used_id, point) 
VALUES 
  (1,   2,                  2,                      100),
  (2,   3,                  3,                      10);

INSERT INTO user_point_logs 
  (id,  user_id,  point,  expire_date,  return_id) 
VALUES
  (1,   16087,    100,    1540649153,   NULL),
  (2,   16087,    100,    NULL      ,   1   ),
  (3,   16087,     10,    NULL      ,   2   ),
  (4,   16083,    100,    1540649153,   NULL),
  (5,   16087,    100,    1540649153,   NULL);

..和小提琴一样

这个问题的问题是我看不到以下问题无法解决的问题的哪一部分:

SELECT MAX(FROM_UNIXTIME(expire_date)) dt
     , SUM(CASE WHEN expire_date < UTC_TIMESTAMP() THEN point END) a
     , SUM(CASE WHEN expire_date IS NULL THEN point END) b
  FROM user_point_logs
 WHERE user_id = 16087
 GROUP 
    BY user_id;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM