我正在尝试将2个表与2列各组合:
每个表中的一列(
Cities
)包含相似的信息,但是其他各列(Names
和Streets
)在每个表中都是独立的。使用common列,我只想合并并列出第二个next列中的所有其他元素作为一个表:
Cities | Names | Streets
列出原始表中的所有
Names
和Streets
,并在第一列中列出正确的City
,不重复Names
或Streets
(如果某个Names
中有更多Streets
或City
,则添加空格。摘要在这里:
https://docs.google.com/spreadsheets/d/e/2PACX-1vQxHJopVBcuUN9RK5fHs7qhVxdry4v3HB6Az3LrRWXJxspV4abTTFS2VQka87GG3s9DHlT6FKUKPWal/pubhtml
我尝试了不同的联接,但是后来我得到了
Names
和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 |
+-------+---------+-----------+
请注意:
跟进以下戈登的回答:几乎在那儿,但不是100%,因为我想保持这座城市的排成一体。
我有更多的街道参与其中,但事实并非如此-请参阅:
如果我以:
创建表名称(
id INT(6)UNSIGNED AUTO_INCREMENT主键,
城市VARCHAR(30)NOT NULL,
名称VARCHAR(30)NOT NULL
);
创建表格街道(
id INT(6)UNSIGNED AUTO_INCREMENT主键,
城市VARCHAR(30)NOT NULL,
街道VARCHAR(30)非空
);
插入
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');插入
names
(id
,city
,name
)VALUES(4,'paris','nameP4');插入
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');插入
streets
(id
,city
,street
)VALUES(1,'paris','streetP1');将INSERT INTO
streets
(id
,city
,street
)VALUES(2,'paris','streetP2');插入
streets
(id
,city
,street
)VALUES(3,'paris','streetP3');插入
streets
(id
,city
,street
)VALUES(3,'paris','streetP4');将INSERT INTO
streets
(id
,city
,street
)VALUES(3,'paris','streetP5');将INSERT INTO
streets
(id
,city
,street
)VALUES(3,'paris','streetP6');将INSERT INTO
streets
(id
,city
,street
)VALUES(3,'paris','streetP7');将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');插入
streets
(id
,city
,street
)VALUES(8,'tokyo','streetT5');插入
streets
(id
,city
,street
)VALUES(9,'tokyo','streetT6');插入
streets
(id
,city
,street
)VALUES(10,'tokyo','streetT7');插入
streets
(id
,city
,street
)VALUES(11,'tokyo','streetT8');将INSERT INTO
streets
(id
,city
,street
)值(12,'tokyo','streetT9');插入
streets
(id
,city
,street
)VALUES(13,'tokyo','streetT10');我正在创建这两个表:
表名
+ ------ + -------- + ------------- +
| id |城市|名称|
+ ———— + ————-——-—— + ————-———— +
| 1 |巴黎|名称P1 |
| 2 |巴黎| nameP2 |
| 3 |巴黎|名称P3 |
| 4 |巴黎|名称P4 |
| 5 |巴黎|名称P5 |
| 6 |东京|名称T1 |
| 7 |东京| nameT2 |
| 8 |东京|名称T3 |
| 9 |东京|名称T4 |
| 10 |东京|名称T5 |
| 11 |东京|名称T6 |
+ ———— + ————-——-—— + ————-———— +
桌子街
+ ——-—— + ——-——-- ++ ————-----
| id |城市|街道|
+ ——--- + -——————- ++ ————-----———— +
| 1 |巴黎| streetP1 |
| 2 |巴黎| streetP2 |
| 3 |巴黎| streetP3 |
| 4 |巴黎| streetP4 |
| 5 |巴黎| streetP5 |
| 6 |巴黎| streetP6 |
| 7 |巴黎| streetP7 |
| 8 |东京| streetT1 |
| 9 |东京| streetT2 |
| 10 |东京| streetT3 |
| 11 |东京| streetT4 |
| 12 |东京| streetT5 |
| 13 |东京| streetT6 |
| 14 |东京| streetT7 |
| 15 |东京| streetT8 |
| 16 |东京| streetT9 |
| 17 |东京| streetT10 |
+ ———— + ————-——- ++ ————————
我想得到:
+ —————————————————————— + ————————————
|城市|名称|街道|
+ ——————————————————————————(-)
|巴黎|名称P1 | streetP1 |
|巴黎| nameP2 | streetP2 |
|巴黎|名称P3 | streetP3 |
|巴黎|名称P4 | streetP4 |
|巴黎|名称P5 | streetP5 |
|巴黎| | streetP6 |
|巴黎| | streetP7 |
|东京|名称T1 | streetT1 |
|东京| nameT2 | streetT2 |
|东京|名称T3 | streetT3 |
|东京|名称T4 | streetT4 |
|东京|名称T5 | streetT5 |
|东京|名称T6 | streetT6 |
|东京| | streetT7 |
|东京| | streetT8 |
|东京| | streetT9 |
|东京| | streetT10 |
+ —————————————————————— + ————————————
但是,随着戈登在下面的初步回应,我得到了:
+ —————————————————————— + ————————————
|城市|名称|街道|
+ ——————————————————————————(-)
|巴黎|名称P1 | streetP1 |
|巴黎| nameP2 | streetP2 |
|巴黎|名称P3 | streetP3 |
|巴黎|名称P4 | streetP4 |
|巴黎|名称P5 | streetP5 |
|东京|名称T1 | streetT1 |
|东京| nameT2 | streetT10 |
|东京|名称T3 | streetT2 |
|东京|名称T4 | streetT3 |
|东京|名称T5 | streetT4 |
|东京|名称T6 | streetT5 |
|巴黎| | streetP6 |
|巴黎| | streetP7 |
|东京| | streetT6 |
|东京| | streetT7 |
|东京| | streetT8 |
|东京| | streetT9 |
+ —————————————————————— + ————————————
任何的想法?似乎只是某个地方的订购清单,但我不知道....谢谢!
最佳答案
我猜您想要“垂直”列表。这实际上不是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;
关于mysql - 如何将SQL中的2个表与1个公共(public)列合并,而在其他列中不合并?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58126321/