2017-09-16 48 views
0

msyql查询为什么我得到的MySQL结果列值dismatch

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.In其实1502852400是9597 记录,我不知道为什么。

+1

你好汤姆。请阅读[这](https://stackoverflow.com/help/how-to-ask)和改善你的问题,使人们可以来帮您吧。 – Jeffrey

+0

你的问题还不清楚。请向我们展示样本输入数据和您期望的输出。 –

+0

START_TIME dismatch主要id.eg.right记录:START_TIME:1,ID:1,但我得到START_TIME:1,ID:2 – Tom

回答

2

在任何其他数据库查询将返回一个错误,因为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; 

在你的情况下,添加一个简单的MIN(id)SELECT可能工作,假设id s的启动时间的增加。

更一般地,你会想:

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黑客经常工作:

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()可以溢出内部缓冲区大小。

+0

我没有错误,但结果是不是做一些 – Tom

+0

好的我需要ID @汤姆。 。 。哪些不会产生您期望的结果?所有应该返回与每个学生用户的最小开始时间相关的'id'。 –

+0

子查询工作正常,谢谢you.I'll尝试group_cat – Tom

相关问题