本帖最后由 php_way 于 2014-12-20 09:17:09 编辑

解决方案 »

  1.   

    1.group by 優先
    2.group by 優先where > group by > 聚合函數 > select
      

  2.   

    那group by执行完成后,产生的虚拟表是什么
    行是哪些,列是哪些?
      

  3.   

    你理解的执行顺序是错误的,至少是不科学的
    如果 tp_goods 有 10000000 条记录,而符合 cat_id=1 的只有一条
    那么你的第一步的抄写 tp_goods 到 VT1 不就浪费了大量时间和空间了吗?所以应该是:
    建立虚拟表 VT(只有 cat_id,goods_name,goods_price 3列)
    遍历 tp_goods 将符合 cat_id=1 的记录追加到 VT 中
    输出 VT 的内容对于 select cat_id,max(goods_price) as max_price from tp_goods group by cat_id
    执行的过程应该是:
    建立虚拟表 VT(只有 cat_id, max_price 2列,并标识 cat_id 为聚类, max_price 为计算)
    遍历 tp_goods 将记录追加到 VT 中,方法是如果 tp_goods.cat_id 的值在 VT.cat_id 中已存在。则修改对应的 max_price 为 max(goods_price,max_price),否则追加
    输出 VT 的内容
      

  4.   

    书是肯定有的,估计应是1990年代的。不过我没看过(给我看我也不一定去看)按流程推演,用 php 的关联数组都可以简单的模拟出那个过程
    mysql 的开发者们总不至于弱智到用你听说的那个流程来操作的吧
      

  5.   

    怎么模拟的?
    所以,我想知道mysql开发者们在程序里是如何操作的按版主的说法,是不是只产生一张虚拟表?如果语句中存在多个 select 呢,会不会有多个虚拟表?如:
    select * from tp_goods where cat_id=(select id from tp_cat where cat_name='手机');
    版主是否举一个比较复杂的语句,包含where, group by, having, orderby....等等的,来解释一下它第一步的执行过程?
      

  6.   

    1.from子句用来组装不同数据源的数据2,where子句用于基于指定条件的筛选3.group by 子句用来将数据划分为多个分组4,使用聚集函数进行计算5.使用having子句对分组进行筛选6.计算所有表达式7.使用order by 对所有结果集进行排序
    遇到上面括号的情况,当然是按照括号内部再如上述优先级执行。
      

  7.   

    特意去翻查了《高性能MySQL》(第二版),没找到楼主说讲的查询顺序的相关描述。希望以下截图能给楼主一些帮助。