Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在一个查询中进行分组和排序?_Mysql_Sql - Fatal编程技术网

Mysql 如何在一个查询中进行分组和排序?

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 '

我有两张表,一张是“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 '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调用中获得所需结果的唯一方法(而多个调用的速度要慢得多)。