Php MySQL查询优化-分组值

Php MySQL查询优化-分组值,php,jquery,mysql,sql,Php,Jquery,Mysql,Sql,好的,这是我的数据库结构: TABLE `books` `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT `title` varchar(25) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' `author` varchar(25) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' PRIMARY KEY (`id`) UNIQUE KEY `ti

好的,这是我的数据库结构:

TABLE `books`
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT
  `title` varchar(25) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
  `author` varchar(25) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
  PRIMARY KEY (`id`)
  UNIQUE KEY `title` (`title`)

TABLE `chapters`
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT
  `book_id` smallint(5) unsigned NOT NULL DEFAULT '0'
  `number` smallint(5) unsigned NOT NULL DEFAULT '0'
  `title` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''
  PRIMARY KEY (`id`)
  KEY `book_id` (`book_id`) -> Foreign on `books`.`id`

TABLE `pages`
  `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT
  `book_id` smallint(5) unsigned NOT NULL DEFAULT '0'
  `chapter_id` smallint(5) unsigned NOT NULL DEFAULT '0'
  `number` smallint(5) unsigned NOT NULL DEFAULT '0' // real number, for page 1 of book 1 this has value 1, for page 1 of book 2 this has value 1...
  `value` float NOT NULL DEFAULT '0'
  PRIMARY KEY (`id`)
  KEY `book_id` (`book_id`) -> Foreign on `books`.`id`
  KEY `chapter_id` (`chapter_id`)  -> Foreign on `chapters`.`id`
现在。。。在PHP页面上,我想显示每本书的平均
页面。value
,每本书的每一章和单个
页面的平均
页面。value
每一页:

Book 1 AVG = X
Book 1 Chapter   1            AVG = X
Book 1 Chapter ...            AVG = X
Book 1 Chapter   N            AVG = X
Book 1 Chapter   1 Page   1   VAL = X
Book 1 Chapter   1 Page ...   VAL = X
Book 1 Chapter   1 Page   N   VAL = X

And so on...
当然,使用3个查询和一些连接将非常简单,并且我可以使用PHP以编程方式重新格式化符合我需要的数据。
但是我想知道是否有可能将这些查询(顺便说一句,执行速度非常慢)优化为单个查询,或者使用高级语法来减少处理时间。

您希望用于搜索的索引列非常有帮助。例如:

CREATE INDEX index_name ON table_name(column_name);
完成同样事情的另一种方法是:

ALTER TABLE table_name ADD INDEX ( column_name );

这样,您的查询执行时间将很快…

您希望用于搜索的索引列将非常有帮助。例如:

CREATE INDEX index_name ON table_name(column_name);
完成同样事情的另一种方法是:

ALTER TABLE table_name ADD INDEX ( column_name );

这样您的查询执行时间会很快…

一种方法是使用
汇总
,但正如Gordon所指出的,这可能不会返回您期望的平均值。这取决于您如何定义这些聚合。然而,我怀疑MySQL确实以您期望的方式定义了这些平均值。这里有一个例子,它简洁地说明了如何回答一个问题以及如何提问(并可能识别出这种方法中的缺陷,其他人可能会批评)

创建表页
(页码id INT非空自动增量主键
,book VARCHAR(20)不为空
,第_章不输入不为空
,第_页不整型不为空
,单词INT不为空
,唯一(书籍,章节号,页码)
);
插入页面(书籍、章节号、页面号、文字)值
(《霍比特人》,1,1,50),
(《霍比特人》,1,2,60),
(《霍比特人》,1310年),
(《霍比特人》,1,4,40),
(《霍比特人》,2,1,60),
(《霍比特人》,2,2,40),
(《霍比特人》,2,3,20),
(《雾都孤儿》,11120年),
(《雾都孤儿》,1,2,30),
(《雾都孤儿》,1,3,30),
(《雾都孤儿》,21100),
(《雾都孤儿》,2,2,50);
选择*
从页数
命令
按部就班
,第(1)章
,第页;
+---------+--------------+------------+---------+-------+
|页码|书籍|章节|页码|文字|
+---------+--------------+------------+---------+-------+
|8 | Oliver Twist | 1 | 1 | 120|
|9 | Oliver Twist | 1 | 2 | 30|
|10 |奥利弗扭转| 1 | 3 | 30|
|11 |奥利弗扭转| 2 | 1 | 100|
|12 |奥利弗扭转| 2 | 2 | 50|
|1 |霍比特人| 1 | 1 | 50|
|2 |霍比特人| 1 | 2 | 60|
|3 |霍比特人| 1 | 3 | 100|
|4 |霍比特人| 1 | 4 | 40|
|5 |霍比特人| 2 | 1 | 60|
|6 |霍比特人| 2 | 2 | 40|
|7 |霍比特人| 2 | 3 | 20|
+---------+--------------+------------+---------+-------+
选书
,第(1)章
,页码
,每页平均字数
从页数
团体
按部就班
,第(1)章
,带有汇总的页码;
+--------------+------------+---------+----------------+
|书籍|章节|页码|每页文字||
+--------------+------------+---------+----------------+
|奥利弗·特维斯| 1 | 1 | 120.0000|
|奥利弗·特维斯| 1 | 2 | 30.0000|
|奥利弗·特维斯| 1 | 3 | 30.0000|

|Oliver Twist | 1 | NULL | 60.0000 |一种方法是使用
汇总
,但正如Gordon所指出的,这可能不会返回您期望的平均值。这取决于您如何定义这些聚合。然而,我怀疑MySQL确实以您期望的方式定义了这些平均值。这里有一个例子,它简洁地说明了如何回答一个问题以及如何提问(并可能识别出这种方法中的缺陷,其他人可能会批评)

创建表页
(页码id INT非空自动增量主键
,book VARCHAR(20)不为空
,第_章不输入不为空
,第_页不整型不为空
,单词INT不为空
,唯一(书籍,章节号,页码)
);
插入页面(书籍、章节号、页面号、文字)值
(《霍比特人》,1,1,50),
(《霍比特人》,1,2,60),
(《霍比特人》,1310年),
(《霍比特人》,1,4,40),
(《霍比特人》,2,1,60),
(《霍比特人》,2,2,40),
(《霍比特人》,2,3,20),
(《雾都孤儿》,11120年),
(《雾都孤儿》,1,2,30),
(《雾都孤儿》,1,3,30),
(《雾都孤儿》,21100),
(《雾都孤儿》,2,2,50);
选择*
从页数
命令
按部就班
,第(1)章
,第页;
+---------+--------------+------------+---------+-------+
|页码|书籍|章节|页码|文字|
+---------+--------------+------------+---------+-------+
|8 | Oliver Twist | 1 | 1 | 120|
|9 | Oliver Twist | 1 | 2 | 30|
|10 |奥利弗扭转| 1 | 3 | 30|
|11 |奥利弗扭转| 2 | 1 | 100|
|12 |奥利弗扭转| 2 | 2 | 50|
|1 |霍比特人| 1 | 1 | 50|
|2 |霍比特人| 1 | 2 | 60|
|3 |霍比特人| 1 | 3 | 100|
|4 |霍比特人| 1 | 4 | 40|
|5 |霍比特人| 2 | 1 | 60|
|6 |霍比特人| 2 | 2 | 40|
|7 |霍比特人| 2 | 3 | 20|
+---------+--------------+------------+---------+-------+
选书
,第(1)章
,页码
,每页平均字数
从页数
团体
按部就班
,第(1)章
,带有汇总的页码;
+--------------+------------+---------+----------------+
|书籍|章节|页码|每页文字||
+--------------+------------+---------+----------------+
|奥利弗·特维斯| 1 | 1|