【问题标题】:Database get rid of repeated attribute数据库摆脱重复属性
【发布时间】:2018-06-27 22:31:47
【问题描述】:

所以基本上我有 3 个表:学生、班级和注册。

CREATE TABLE class
    (`class_name` varchar(13), `class_id` int primary key)
;

INSERT INTO class
    (`class_name`, `class_id`)
VALUES
    ('math', 5697),
    ('science', 5768),
    ('computer', 6315),
    ('physical-ed', 6422),
    ('music', 7528),
    ('art', 7604),
    ('jrotc', 8797),
    ('culinary-arts', 8069)
;


CREATE TABLE student
    (`student_fname` varchar(8), `student_id` varchar(11) primary key)
;

INSERT INTO student
    (`student_fname`, `student_id`)
VALUES
    ('james', 'Vre94b3JpXO'),
    ('jim', 'JzqQ2zRVNm1'),
    ('jenny', 'xgqv9P42eYL'),
    ('kyle', 'QLNM0Wbyqk0'),
    ('kimberly', 'P2egAddWN0Q'),
    ('kayla', 'EGNDjWAreAy'),
    ('noah', 'bPeOyMMONGr'),
    ('nataly', '9Op53GGmqk5')
;

create table enrollment (
  `no` int(10),
  `student_id` varchar(11),
  `class_id` int,
  `semester` varchar(20),
  primary key (`student_id`, `class_id`, `semester`),
  foreign key (`student_id`) references student (`student_id`),
  foreign key (`class_id`) references class (`class_id`)
);

insert into enrollment values
(1, 'Vre94b3JpXO', 5697, 'Fall 2015'),
(2,'JzqQ2zRVNm1', 5697, 'Fall 2015'),
(3, 'xgqv9P42eYL', 5697, 'Fall 2015'),
(4, 'JzqQ2zRVNm1', 8069, 'Fall 2014'),
(5, 'xgqv9P42eYL', 8069, 'Fall 2014');

如果我按照查询:

select * from student s 
join enrollment e on s.student_id = e.student_id 
join class c on c.class_id = e.class_id

我会得到这样的东西:

我怎样才能删除像 student_id 和 class_id 这样的冗余列?

这个问题是从页面扩展而来的: Table structure - Link one student with multiple classes id

demo

我一直在使用加入的方法,但无法得到我想要的,谢谢你的帮助。

【问题讨论】:

  • select s.*, e.*, c.class_name...

标签: mysql database


【解决方案1】:

要回答这个问题,最好回顾一些基础知识:

SELECT *

* 用于显示您选择的表中的所有列

如果您只想显示某些列,则必须具体命名:

SELECT class_name, ...

但是如果你有一些表具有相同的列名,你必须指定表名或别名:

SELECT c.class_name
 FROM mytable t 
 INNER JOIN class c ON c.id_table = t.id

【讨论】:

    【解决方案2】:

    类似这样的:

    SELECT s.* ,e.no ,e.class_id ,e.semester ,c.class_name FROM student s INNER JOIN enrollment e ON s.student_id = e.student_id INNER JOIN class c ON c.class_id = e.class_id

    在您的选择中,您可以指定您想要的每一列,从而指定什么顺序。

    SELECT e.no
    ,e.class_id
    

    如果您想要一个表格中的所有列,您可以像这样执行表格点星:

    SELECT s.*
    

    正如您在现有查询中已有的那样,您可以简单地使用星号来获取所有列:

    SELECT *
    

    这里是一些基本 SELECT 技巧的起点:https://www.techrepublic.com/article/sql-basics-select-statement-options/

    顺便说一句,使用http://poorsql.com/ 之类的网站来帮助您进行 SQL 格式化会很有帮助。

    【讨论】:

      【解决方案3】:

      只需指定要查看的列。

      select s.student_fname, s.student_id,
      e.no, e.class_id, e.semester, 
      c.class_name,   
      from 
      student s join enrollment e 
      on s.student_id = e.student_id 
      join class c 
      on c.class_id = e.class_id ;
      

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 2012-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        相关资源
        最近更新 更多