MySql - 将三个表中的数据合并到一个表中

时间:2016-04-08 15:02:30

标签: mysql sql database-design

我有3个表格,用于分区,地区和police_stations表的数据。表数据依赖于

divisions
- districts
 -- police_stations

表格式

divisions
  id
  name

districts
  id
  division_id
  name

police_stations
  id
  division_id
  district_id
  name

我可以只使用当前表依赖项设计一个包含所有表数据的表吗?如果可以的话,遍历过程怎么样?

3 个答案:

答案 0 :(得分:1)

要将多个表组合在一起,您应该使用JOINS。这是比创建新表更好的数据库实践。

  

只要两个表中的列之间存在匹配,INNER JOIN关键字就会选择两个表中的所有行。

SELECT *
FROM divisions divis
INNER JOIN districts dis 
ON dis.division_id = divis.id
INNER JOIN police_stations pol
ON pol.district_id = dis.id

注意:显然,DIV关键字在mysql中保留,因此您必须使用其他内容来识别分区。

如果您坚持使用此数据创建新表,则可以使用CREATE TABLE AS配方。

为了做到这一点,我们需要修改原始模式。新表不能有重复的名称,因此我们必须将原始表更改为所有具有唯一列的列。

例如name变为district_name

CREATE TABLE combined AS (
  SELECT divis.id, divis.division_name, dis.district_name, pol.police_name
  FROM divisions divis
  LEFT JOIN districts dis
  ON divis.id = dis.division_id
  LEFT JOIN police_stations pol
  ON pol.district_id = dis.id
);

这是演示它的小提琴

http://sqlfiddle.com/#!9/7ec3b/1/0

这是非常糟糕的数据库设计。我推荐第一个解决方案

答案 1 :(得分:1)

使用单个表:将id用于唯一标识每一行;它将是PRIMARY KEY。会有一个parent_id来说明其他哪一行是其父母' (分区是地区的父母等)。

JOIN变为self join

SELECT ...
    FROM tbl AS division
    JOIN tbl AS district ON division.id = district.parent_id
    JOIN tbl AS station  ON district.id = station.parent_id
    WHERE ...

确保符合资格' SELECTWHERE中的每个字段都带有相应的'别名'例如:division.name

这种设计模式适用于大多数'等级'任意深度的结构。你的正好是3级,所以它更简单。

请注意,任何"区" parent_id0。行。拥有INDEX(parent_id)

会很有用

答案 2 :(得分:0)

希望它能解决你的问题

 SELECT * from divisions d
          join police_stations ps on d.id=ps.division_id
          join districts dist on ps.district_id =dist.id;