• 数据库设计问题 – SQL


    要求:a 表:`id`, `name` ; 作为词表,存放不同的词;b 表:`id`, `attr` ; 作为属性表,存放各种属性;其中,一个词可以有不同的多个属性;而每个词的属性的个数也不一定相同;c 表:`id`, `aid`, `bid` ; 作为关系表,存放每个词的对应关系;写出 SQL 语句,来得到每个词拥有属性总数的逆向(DESC)排序:

    各种表的信息如下:

    mysql> DESC `a`; DESC `b`; DESC `c`;
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(255)        | NO   |     | NULL    |                |
    +-------+---------------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | attr  | varchar(255)        | NO   |     | NULL    |                |
    +-------+---------------------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
    
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | id    | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
    | aid   | int(8)              | NO   |     | NULL    |                |
    | bid   | int(8)              | NO   |     | NULL    |                |
    +-------+---------------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)

    我们预先放入测试的数据,如下:

    mysql> SELECT * FROM `a`; SELECT * FROM `b`; SELECT * FROM `c`;
    +----+------+
    | id | name |
    +----+------+
    |  1 | a    |
    |  2 | b    |
    |  3 | c    |
    |  4 | d    |
    |  5 | e    |
    +----+------+
    5 rows in set (0.00 sec)
    
    +----+------+
    | id | attr |
    +----+------+
    |  1 | 111  |
    |  2 | 112  |
    |  3 | 113  |
    |  4 | 123  |
    |  5 | 221  |
    |  6 | 231  |
    |  7 | 252  |
    |  8 | 278  |
    |  9 | 292  |
    | 10 | 256  |
    | 11 | 578  |
    | 12 | 653  |
    | 13 | 521  |
    | 14 | 502  |
    +----+------+
    14 rows in set (0.00 sec)
    
    +----+-----+-----+
    | id | aid | bid |
    +----+-----+-----+
    |  1 |   1 |   1 |
    |  2 |   1 |   2 |
    |  3 |   1 |   4 |
    |  4 |   1 |   7 |
    |  5 |   2 |   8 |
    |  6 |   2 |  11 |
    |  7 |   3 |   3 |
    |  8 |   3 |   5 |
    |  9 |   3 |   6 |
    | 10 |   4 |   9 |
    | 11 |   4 |  10 |
    | 12 |   5 |  12 |
    | 13 |   5 |  13 |
    | 14 |   5 |  14 |
    +----+-----+-----+
    14 rows in set (0.00 sec)

    首先执行下列语句:

    mysql> SELECT COUNT(`bid`) AS `attrcounts` FROM `c` GROUP BY `aid` ORDER BY `attrcounts` DESC;
    +------------+
    | attrcounts |
    +------------+
    |          4 |
    |          3 |
    |          3 |
    |          2 |
    |          2 |
    +------------+
    5 rows in set (0.00 sec)

    进而,我们再连表:

    mysql> SELECT a.name, COUNT(c.bid) AS `attrcounts` FROM `c` LEFT JOIN `a` ON a.id = c.aid GROUP BY c.aid ORDER BY `attrcounts` DESC;
    +------+------------+
    | name | attrcounts |
    +------+------------+
    | a    |          4 |
    | c    |          3 |
    | e    |          3 |
    | b    |          2 |
    | d    |          2 |
    +------+------------+
    5 rows in set (0.00 sec)

    于是,我们得到了结果;

    -------

    补充一些基础知识:

    如何修改已有表的列:http://www.w3school.com.cn/sql/sql_alter.asp

    GROUP BY 相关知识:http://www.w3school.com.cn/sql/sql_groupby.asp



  • 相关阅读:
    cnblogs blogStats All In One
    ESLint & vue template indent validate All In One
    vue & elementui 表单验证 bug All In One
    vue 表单验证 rule.message bug All In One
    vue 表单验证 rule message bug All In One
    Node.js & TypeScript error All In One
    VS2010如何调试IIS上的网站
    用LINQ查询XML并绑定给GridView显示
    SQLServer2008评估期已过解决方法
    ASP.NET给用户控件(.ascx)增加属性
  • 原文地址:https://www.cnblogs.com/catprayer/p/1965848.html
Copyright © 2020-2023  润新知