【问题标题】:Why i get mysql result column value dismatch为什么我得到 mysql 结果列值不匹配
【发布时间】:2018-02-25 12:33:21
【问题描述】:

msyql 查询

SELECT id,student_user_id,MIN(start_time) FROM appoint_course 
WHERE student_user_id IN(
    931,2034,2068,2111,2115,2173,2181,2285,2500,2505,2507,
    2518,2594,2596,2600,2608,2637,2652,2654
) 
AND course_type=3 and disabled=0  GROUP BY student_user_id;

结果 [查询结果]

+-------+-----------------+-----------------+
| id    | student_user_id | MIN(start_time) |
+-------+-----------------+-----------------+
|  8356 |             931 |      1500351000 |
|  9205 |            2034 |      1501733400 |
|  9246 |            2068 |      1501649100 |
|  9755 |            2111 |      1502943000 |
|  9585 |            2115 |      1502595300 |
| 10820 |            2173 |      1503545700 |
|  9594 |            2181 |      1502852400 |
| 10324 |            2285 |      1502852400 |
| 11204 |            2500 |      1504839600 |
| 11152 |            2507 |      1504064100 |
| 12480 |            2594 |      1505707800 |
| 11521 |            2608 |      1504494000 |
| 11818 |            2652 |      1504753200 |
+-------+-----------------+-----------------+

但正确的开始时间是:

id: 9594
start_time: 1503284400

9594 正确的 start_time 是 1503284400 而不是 1502852400。实际上 1502852400 是 9597 的记录 我不知道为什么。

【问题讨论】:

  • 你好汤姆。请阅读this 并改进您的问题,以便人们可以帮助您。
  • 您的问题不清楚。请向我们展示示例输入数据和您期望的输出。
  • start_time 不匹配主 id.eg.right 记录:start_time:1,id:1,但我得到了 start_time:1,id:2

标签: mysql sql group-by min


【解决方案1】:

在任何其他数据库中,您的查询都会返回错误,因为id 不在group by 中。正确的查询是:

SELECT student_user_id, MIN(start_time)
FROM appoint_course
WHERE student_user_id IN (931,2034,2068,2111,2115,2173,2181,2285,2500,2505,2507,2518,2594,2596,2600,2608,2637,2652,2654) AND
      course_type = 3 and disabled = 0
GROUP BY student_user_id;

在您的情况下,假设ids 随开始时间增加,将简单的MIN(id) 添加到SELECT 可能会起作用。

更一般地说,您似乎想要:

SELECT ac.*
FROM appoint_course ac
WHERE ac.student_user_id IN (931,2034,2068,2111,2115,2173,2181,2285,2500,2505,2507,2518,2594,2596,2600,2608,2637,2652,2654) AND
      ac.course_type = 3 AND ac.disabled = 0 AND
      ac.start_time = (SELECT MIN(ac2.start_time)
                       FROM appoint_course ac2
                       WHERE ac2.student_user_id = ac.student_user_id AND
                             ac2.course_type = ac.course_type AND
                             ac2.disabled = ac.disabled
                      );

不需要GROUP BY

我应该补充一点,有一个 MySQL hack 经常有效:

SELECT student_user_id, MIN(start_time),
       SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY start_time), ',', 1) as id_at_min_start_time
FROM appoint_course
WHERE student_user_id IN (931,2034,2068,2111,2115,2173,2181,2285,2500,2505,2507,2518,2594,2596,2600,2608,2637,2652,2654) AND
      course_type = 3 and disabled = 0
GROUP BY student_user_id;

这使用字符串操作,GROUP_CONCAT() 可能会溢出内部缓冲区大小。

【讨论】:

  • 我没有收到错误,但结果不正确。我需要 id 来做某事
  • @Tom 。 . .其中哪一个没有产生您期望的结果?所有人都应该返回与每个学生用户的最短开始时间相关联的id
  • 子查询工作正常,谢谢。我试试 group_cat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2020-11-08
相关资源
最近更新 更多