mysql - 如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?
问题描述
我正在尝试将 2 个表与每个 2 列结合起来:
- 一个与城市| 名称
- 一个与城市| 街道
每个表中的一列 ( Cities
) 包含相似的信息,但其他列 (Names
和Streets
) 在每个表中是独立的。
使用 common 列,我只想将下 2 列中的所有其他元素组合并列出为一个表:
Cities | Names | Streets
列出原始表格中的所有Names
and 并在第一列中正确列出,不重复or (如果某个.Streets
City
Names
Streets
Names
Streets
City
总结在这里:
我尝试了不同的连接,但是我得到了Names
and之间的所有组合Streets
,这不是我想要的。
这不起作用:
select *
from city, street
where city.city = street.city
order by city.name asc, street.name asc;
请在此处查看 GoogleSheet:https ://docs.google.com/spreadsheets/d/e/2PACX-1vQxHJopVBcuUN9RK5fHs7qhVxdry4v3HB6Az3LrRWXJxspV4abTTFS2VQka87GG3s9DHlT6FKUKPWal/pubhtml
添加代码以创建表格,以防有人想尝试使用它:
CREATE TABLE names
(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(30) NOT NULL,
name VARCHAR(30) NOT NULL
);
CREATE TABLE streets
(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(30) NOT NULL,
street VARCHAR(30) NOT NULL
);
INSERT INTO `names` (`id`, `city`, `name`) VALUES (1, 'paris', 'nameP1');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (2, 'paris', 'nameP2');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (3, 'paris', 'nameP3');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (4, 'paris', 'nameP4');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (5, 'paris', 'nameP5');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (6, 'tokyo', 'nameT1');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (7, 'tokyo', 'nameT2');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (8, 'tokyo', 'nameT3');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (9, 'tokyo', 'nameT4');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (10, 'tokyo', 'nameT5');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (11, 'tokyo', 'nameT6');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (1, 'paris', 'streetP1');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (2, 'paris', 'streetP2');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (3, 'paris', 'streetP3');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (4, 'tokyo', 'streetT1');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (5, 'tokyo', 'streetT2');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (6, 'tokyo', 'streetT3');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (7, 'tokyo', 'streetT4');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (8, 'tokyo', 'streetT5');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (9, 'tokyo', 'streetT6');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (10, 'tokyo', 'streetT7');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (11, 'tokyo', 'streetT8');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (12, 'tokyo', 'streetT9');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (13, 'tokyo', 'streetT10');
在此处添加我的表格和预期结果:
表名:
+---—+-------+--------+
| id | City | Names |
+---—+-------+--------+
| 1 | paris | nameP1 |
| 2 | paris | nameP2 |
| 3 | paris | nameP3 |
| 4 | paris | nameP4 |
| 5 | paris | nameP5 |
| 6 | tokyo | nameT1 |
| 7 | tokyo | nameT2 |
| 8 | tokyo | nameT3 |
| 9 | tokyo | nameT4 |
| 10 | tokyo | nameT5 |
| 11 | tokyo | nameT6 |
+---—+-------+--------+
餐桌街:
+----+-------+-----------+
| id | City | Streets |
+----+-------+-----------+
| 1 | paris | streetP1 |
| 2 | paris | streetP2 |
| 3 | paris | streetP3 |
| 4 | tokyo | streetT1 |
| 5 | tokyo | streetT2 |
| 6 | tokyo | streetT3 |
| 7 | tokyo | streetT4 |
| 8 | tokyo | streetT5 |
| 9 | tokyo | streetT6 |
| 10 | tokyo | streetT7 |
| 11 | tokyo | streetT8 |
| 12 | tokyo | streetT9 |
| 13 | tokyo | streetT10 |
+----+-------+-----------+
预期成绩:
+-------+---------+-----------+
| City | Names | Streets |
+-------+---------+-----------+
| paris | nameP1 | streetP1 |
| paris | nameP2 | streetP2 |
| paris | nameP3 | streetP3 |
| paris | nameP4 | |
| paris | nameP5 | |
| tokyo | nameT1 | streetT1 |
| tokyo | nameT2 | streetT2 |
| tokyo | nameT3 | streetT3 |
| tokyo | nameT4 | streetT4 |
| tokyo | nameT5 | streetT5 |
| tokyo | nameT6 | streetT6 |
| tokyo | | streetT7 |
| tokyo | | streetT8 |
| tokyo | | streetT9 |
| tokyo | | streetT10 |
+-------+---------+-----------+
请注意:
- 表 'names' 列出了 5 个在巴黎的名字,6 个在东京的名字
- 表“街道”列出了巴黎的 3 条街道、东京的 10 条街道
- 结果应在第 1 列中列出 2 个城市,在巴黎旁边的接下来的 2 列中列出巴黎的 5 个名称和 3 条街道,然后在东京旁边的东京的 6 个名称和 10 条街道
- 名称和街道之间没有关系,除非它们在同一个城市
- 巴黎的名字比街道多,东京的街道比名字多,所以有些值留空以适应这种情况
在下面跟进 Gordon 的回答:几乎就在那里,但不是 100%,因为我想把这座城市的行列在一起。如果我在党派中有更多的街道,那并不完全是 - 见:
如果我开始:
创建表名称(id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,城市 VARCHAR(30) NOT NULL,名称 VARCHAR(30) NOT NULL);
CREATE TABLE 街道(id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, city VARCHAR(30) NOT NULL, street VARCHAR(30) NOT NULL);
插入names
( id
, city
, name
) 值 (1, 'paris', 'nameP1'); 插入names
( id
, city
, name
) 值 (2, 'paris', 'nameP2'); 插入names
( id
, city
, name
) 值 (3, 'paris', 'nameP3'); 插入names
( id
, city
, name
) 值 (4, 'paris', 'nameP4'); 插入names
( id
, city
, name
) 值 (5, 'paris', 'nameP5'); 插入names
( id
, city
, name
) 值 (6, 'tokyo', 'nameT1'); 插入names
( id
, city
, name
) 值 (7, 'tokyo', 'nameT2'); 插入names
( id
, city
, name
) 值 (8, '东京', 'nameT3'); 插入names
( id
, city
, name
) 值 (9, 'tokyo', 'nameT4'); 插入names
( id
, city
, name
) 值 (10, 'tokyo', 'nameT5'); 插入names
( id
, city
, name
) 值 (11, 'tokyo', 'nameT6');
插入streets
( id
, city
, street
) 值 (1, 'paris', 'streetP1'); 插入streets
( id
, city
, street
) 值 (2, 'paris', 'streetP2'); 插入streets
( id
, city
, street
) 值 (3, 'paris', 'streetP3'); 插入streets
( id
, city
, street
) 值 (3, 'paris', 'streetP4'); 插入streets
( id
, city
, street
) 值 (3, 'paris', 'streetP5'); 插入streets
( id
, city
, street
) 值 (3, 'paris', 'streetP6'); 插入streets
( id
, city
, street
) 值 (3, 'paris', 'streetP7'); 插入streets
( id
, city
,street
) 值 (4, '东京', 'streetT1'); 插入streets
( id
, city
, street
) 值 (5, 'tokyo', 'streetT2'); 插入streets
( id
, city
, street
) 值 (6, 'tokyo', 'streetT3'); 插入streets
( id
, city
, street
) 值 (7, 'tokyo', 'streetT4'); 插入streets
( id
, city
, street
) 值 (8, 'tokyo', 'streetT5'); 插入streets
( id
, city
, street
) 值 (9, 'tokyo', 'streetT6'); 插入streets
( id
, city
, street
) 值 (10, 'tokyo', 'streetT7'); 插入streets
( id
, city
, street
) 值 (11, 'tokyo', ' 街道T8'); streets
插入( id
, city
,street
) 值 (12, '东京', 'streetT9'); 插入streets
( id
, city
, street
) 值 (13, 'tokyo', 'streetT10');
我正在创建这两个表:
表名+——————+——-——-——+————————+ | 编号 | 城市 | 姓名 | +——+————————+——-————+ | 1 | 巴黎 | 名称P1 | | 2 | 巴黎 | 名称P2 | | 3 | 巴黎 | 名称P3 | | 4 | 巴黎 | 名称P4 | | 5 | 巴黎 | 名称P5 | | 6 | 东京 | 名称T1 | | 7 | 东京 | 名称T2 | | 8 | 东京 | 名称T3 | | 9 | 东京 | 名称T4 | | 10 | 东京 | 名称T5 | | 11 | 东京 | 名称T6 | +——+————————+——-————+
桌子街道+——-——+————————+————————————+ | 编号 | 城市 | 街道 | +——-——+————————+——————————+ | 1 | 巴黎 | 街道P1 | | 2 | 巴黎 | 街道P2 | | 3 | 巴黎 | 街道P3 | | 4 | 巴黎 | 街道P4 | | 5 | 巴黎 | 街道P5 | | 6 | 巴黎 | 街道P6 | | 7 | 巴黎 | 街道P7 | | 8 | 东京 | 街道T1 | | 9 | 东京 | 街道T2 | | 10 | 东京 | 街道T3 | | 11 | 东京 | 街道T4 | | 12 | 东京 | 街道T5 | | 13 | 东京 | 街道T6 | | 14 | 东京 | 街道T7 | | 15 | 东京 | 街道T8 | | 16 | 东京 | 街道T9 | | 17 | 东京 | 街道T10 | +———+———-———+———-———-———+
我想得到:
+———-———-——+——————-———+———-———-———-—+ | 城市 | 姓名 | 街道 | +————————+————————+————————————+ | 巴黎 | 名称P1 | 街道P1 | | 巴黎 | 名称P2 | 街道P2 | | 巴黎 | 名称P3 | 街道P3 | | 巴黎 | 名称P4 | 街道P4 | | 巴黎 | 名称P5 | 街道P5 | | 巴黎 | | 街道P6 | | 巴黎 | | 街道P7 | | 东京 | 名称T1 | 街道T1 | | 东京 | 名称T2 | 街道T2 | | 东京 | 名称T3 | 街道T3 | | 东京 | 名称T4 | 街道T4 | | 东京 | 名称T5 | 街道T5 | | 东京 | 名称T6 | 街道T6 | | 东京 | | 街道T7 | | 东京 | | 街道T8 | | 东京 | | 街道T9 | | 东京 | | 街道T10 | +————————+————————+————————————+
但随着戈登的初步回应如下,我得到:
+———-———-——+——————-———+———-———-———-—+ | 城市 | 姓名 | 街道 | +————————+————————+————————————+ | 巴黎 | 名称P1 | 街道P1 | | 巴黎 | 名称P2 | 街道P2 | | 巴黎 | 名称P3 | 街道P3 | | 巴黎 | 名称P4 | 街道P4 | | 巴黎 | 名称P5 | 街道P5 | | 东京 | 名称T1 | 街道T1 | | 东京 | 名称T2 | 街道T10 | | 东京 | 名称T3 | 街道T2 | | 东京 | 名称T4 | 街道T3 | | 东京 | 名称T5 | 街道T4 | | 东京 | 名称T6 | 街道T5 | | 巴黎 | | 街道P6 | | 巴黎 | | 街道P7 | | 东京 | | 街道T6 | | 东京 | | 街道T7 | | 东京 | | 街道T8 | | 东京 | | 街道T9 | +————————+————————+————————————+
任何想法?似乎只是某个地方的订购问题,但我无法弄清楚....谢谢!
解决方案
我猜你想要“垂直”列表。这不是 SQL 的真正工作方式,但您可以使用row_number()
和聚合来做到这一点:
select city, max(name) as name, max(street) as street
from ((select city, name, null as street,
row_number() over (partition by city order by name) as seqnum
from names
) union all
(select city, null, street,
row_number() over (partition by city order by street) as seqnum
from streets
)
) sn
group by city, seqnum
order by city, seqnum;
推荐阅读
- python - 在 uWSGI 运行的烧瓶应用程序中以 sudo 身份运行 shell 脚本时的身份验证错误
- javascript - 在 Custom Next.js App 组件中没有继承 React 道具
- javascript - 将新对象添加到从 Fetch 返回的对象的键中,并且需要重新获取新的附加值
- spring - Spring @Value 注入转换在 @SpringJUnitConfig 测试中不起作用
- ruby-on-rails - 如何使用补丁请求更新 Rails 中的布尔属性
- ios - 将视图作为参数添加到自定义 ViewModifier
- vb.net - 如何对 String 变量的 int 值求和?
- javascript - 如何使用 ajax 调用、控制器和片段显示弹出窗口
- go - 路径中的 golang 和 go-socket.io 参数
- google-apps-script - Google Apps 脚本 - setRichTextValue() 异常可能由 for 循环引起