Home > Database > Mysql Tutorial > MySQL的SQL 语句:根据从表记录个数对主表排序

MySQL的SQL 语句:根据从表记录个数对主表排序

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-07 16:56:32
Original
1164 people have browsed it

注: 1,以上两例中形如 group by a.nId 的字段 nId 的值应该保持唯一性,最好是建有唯一性索引。 2,第一例似乎比较容

    一个主表 news,有字段 nId(自动增长),sName。
    记录:
    10 name10
    13 name13
    20 name20
    21 name20
    21 name20
    30 name20

    从表 reply,字段 nId(自动增长),pId,sReply。
    记录:
    20 aaaaa
    13 bbbbb
    10 ccccccc
    20 vvvvvv
    20 hhhhhh
    10 sssss

    从表以字段 pId 与主表字段 nId 关联。

    目的:由主表取若干记录,排序依据:根据从表中与主表关联的记录的个数来排序。

    以上述的记录为例,主表的记录顺序应该为:
    20 name20
    10 name10
    13 name13

    答案1:
    select *, count(*) as iReply from
      (SELECT a.nId, a.sName, b.sReply FROM news a, reply b WHERE a.nId=b.pId) as T
      group by nId order by iReply limit 0,3
    答案2:
      SELECT a.nId, a.sName, count(b.sReply) as iReply from FROM news a, reply b WHERE a.nId=b.pId
      group by a.nId order by iReply limit 0,3

    注:
    1,以上两例中形如 group by a.nId 的字段 nId 的值应该保持唯一性,最好是建有唯一性索引。
    2,第一例似乎比较容易理解,即从联合查表的结果中再次查表。联合查表的结果作为一个“表”,再操作它 - 注意这里的 SQL 语句的语法值得借鉴。
    3,好的解决方法应该是第二例。
    4,但以上两例的做法的最大缺点是,效率太低!联合查表是最表的笛卡尔乘积,查询数量是两个表记录数的乘积。这对于大表查询将是致命的。
       好的做法是,在主表中建一个字段表示从表的记录个数,每次向从表插入记录和删除记录时都同时修改该字段的值。则达到题目的目的,只要查主表、排序就可以了。

linux

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
MySQL stops process
From 1970-01-01 08:00:00
0
0
0
Error when installing mysql on linux
From 1970-01-01 08:00:00
0
0
0
phpstudy cannot start mysql?
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template