Mysql 如何在一个查询中进行分组和排序?
我有两张表,一张是“tb_学生”,另一张是“tb_费用” 为“tb_学生”创建查询Mysql 如何在一个查询中进行分组和排序?,mysql,sql,Mysql,Sql,我有两张表,一张是“tb_学生”,另一张是“tb_费用” 为“tb_学生”创建查询 CREATE TABLE `tb_student` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `class` varchar(255) NOT NULL, `created_on` datetime NOT NULL default '
CREATE TABLE `tb_student` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`class` varchar(255) NOT NULL,
`created_on` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
)
创建“tb_费用”查询
CREATE TABLE `tb_fees` (
`id` int(11) NOT NULL auto_increment,
`email` varchar(255) NOT NULL,
`amount` varchar(255) NOT NULL,
`created_on` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
)
在第一个表中,我存储学生详细信息,在另一个表中存储费用详细信息
我想从“tb_学生”中选择学生详细信息,最后从“tb_费用”中为6班的学生添加费用
所以我试过这个
SELECT *
FROM tb_student s INNER JOIN
tb_fees f on
s.email =f.email
WHERE s.class = 6 GROUP BY s.email ORDER BY f.created_on DESC
这将只给出第一次创建的结果以及如何获取最后创建的值
费用表
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (5,'ram@gmail.com','5000','2013-05-01 14:20:15');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (6,'Sam@gmail.com','5000','2013-05-02 14:20:23');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (7,'jak@gmail.com','5000','2013-05-03 14:20:30');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (8,'Sam@gmail.com','5000','2013-05-29 14:20:35');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (9,'ram@gmail.com','5000','2013-05-30 14:20:39');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (10,'jak@gmail.com','5000','2013-05-30 14:36:13');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (11,'rose@gmail.com','5000','2013-05-30 14:36:15');
insert into `tb_fees`(`id`,`email`,`amount`,`created_on`) values (12,'nim@gmail.com','5000','2013-05-30 14:36:15');
学生表值
insert into `tb_student`(`id`,`name`,`email`,`class`,`created_on`) values (5,'Ram','ram@gmail.com','6','2013-04-30 14:00:56');
insert into `tb_student`(`id`,`name`,`email`,`class`,`created_on`) values (6,'Sam','Sam@gmail.com','6','2013-03-30 14:01:30');
insert into `tb_student`(`id`,`name`,`email`,`class`,`created_on`) values (7,'Nimmy','nim@gmail.com','7','2013-04-30 13:59:59');
insert into `tb_student`(`id`,`name`,`email`,`class`,`created_on`) values (8,'jak','jak@gmail.com','6','2013-03-30 14:07:32');
insert into `tb_student`(`id`,`name`,`email`,`class`,`created_on`) values (9,'rose','rose@gmail.com','5','2013-04-30 14:07:51');
感谢您获取最新的费用,例如:-
SELECT s.* , f.*
FROM tb_student s
INNER JOIN
(SELECT email, MAX(created_on) AS created_on
FROM tb_fees
GROUP BY email) Sub1
ON s.email = sub1.email
INNER JOIN tb_fees f
ON s.email = f.email AND Sub1.created_on = f.created_on
WHERE s.class = 6
顺便说一句,您可能希望在电子邮件字段上建立索引(或者更好,使用tb_费用表上的tb_学生id字段,而不是电子邮件字段并为其建立索引)使用MAX group函数
SELECT s.*, f.amount,MAX(f.created_on)
FROM tb_student s
INNER JOIN
tb_fees f
ON
s.email =f.email
WHERE s.class = 6
GROUP BY s.email
给你想要结果的样本记录?有错误吗?它不会总是给你第一个创建的,尽管可能会。它提供给您的是未定义的。它将显示tb_费用表中的所有剩余字段。原始字段不起作用,因为它带回了最新的费用日期,但其他费用详细信息将随机提供给该学生。对于编辑后的版本,我看不出使用HAVING会如何工作。请阅读本文以了解为什么您使用group by子句是错误的,并且会被其他所有DBMS拒绝。它不起作用。随着测试日期的更改,每行的费用金额可能会有所不同,这可能会变得明显。金额值首先创建两个内部联接需要时间执行联接如果索引正确,则实际上不需要时间执行联接(因此索引建议)。但是,这样做或等效操作几乎是在单个SQL调用中获得所需结果的唯一方法(而多个调用的速度要慢得多)。