我有3个表格,用于分区,地区和police_stations表的数据。表数据依赖于
divisions
- districts
-- police_stations
表格式
divisions
id
name
districts
id
division_id
name
police_stations
id
division_id
district_id
name
我可以只使用当前表依赖项设计一个包含所有表数据的表吗?如果可以的话,遍历过程怎么样?
答案 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 ...
确保符合资格' SELECT
和WHERE
中的每个字段都带有相应的'别名'例如:division.name
。
这种设计模式适用于大多数'等级'任意深度的结构。你的正好是3级,所以它更简单。
请注意,任何"区" parent_id
为0
。行。拥有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;