我正在尝试将2个表与2列各组合:

  • 与城市合一|命名
  • 与城市合一|街道

  • 每个表中的一列(Cities)包含相似的信息,但是其他各列(NamesStreets)在每个表中都是独立的。

    使用common列,我只想合并并列出第二个next列中的所有其他元素作为一个表:
    Cities | Names | Streets
    

    列出原始表中的所有NamesStreets,并在第一列中列出正确的City,不重复NamesStreets(如果某个Names中有更多StreetsCity,则添加空格。

    摘要在这里:

    https://docs.google.com/spreadsheets/d/e/2PACX-1vQxHJopVBcuUN9RK5fHs7qhVxdry4v3HB6Az3LrRWXJxspV4abTTFS2VQka87GG3s9DHlT6FKUKPWal/pubhtml

    我尝试了不同的联接,但是后来我得到了NamesStreets之间的所有组合,这不是我想要的。

    这不起作用:
    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 |
    +-------+---------+-----------+
    

    请注意:
  • 表“名称”列出了巴黎的5个名字,东京的6个名字
  • 表“streets”列出了巴黎的3条街道,东京的10条街道
  • 结果应在第1列中列出2个城市,在巴黎旁边的接下来的2列中列出巴黎的5个名称和3条街道,然后在东京
  • 旁边的东京的6个名称和10条街道
  • 名称和街道之间没有关系,只是它们在同一城市
  • 巴黎的名称比街道的名称更多,东京的名称比街道的名称更多,因此一些值保留为空白以容纳此

  • 跟进以下戈登的回答:几乎在那儿,但不是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(idcityname)VALUES(1,'paris','nameP1');
    将INSERT INTO names(idcityname)VALUES(2,'paris','nameP2');
    将INSERT INTO names(idcityname)VALUES(3,'paris','nameP3');
    插入names(idcityname)VALUES(4,'paris','nameP4');
    插入names(idcityname)VALUES(5,'paris','nameP5');
    将INSERT INTO names(idcityname)VALUES(6,'tokyo','nameT1');
    将INSERT INTO names(idcityname)VALUES(7,'tokyo','nameT2');
    将INSERT INTO names(idcityname)VALUES(8,'tokyo','nameT3');
    将INSERT INTO names(idcityname)VALUES(9,'tokyo','nameT4');
    INSERT INTO names(idcityname)VALUES(10,'tokyo','nameT5');
    将INSERT INTO names(idcityname)VALUES(11,'tokyo','nameT6');

    插入streets(idcitystreet)VALUES(1,'paris','streetP1');
    将INSERT INTO streets(idcitystreet)VALUES(2,'paris','streetP2');
    插入streets(idcitystreet)VALUES(3,'paris','streetP3');
    插入streets(idcitystreet)VALUES(3,'paris','streetP4');
    将INSERT INTO streets(idcitystreet)VALUES(3,'paris','streetP5');
    将INSERT INTO streets(idcitystreet)VALUES(3,'paris','streetP6');
    将INSERT INTO streets(idcitystreet)VALUES(3,'paris','streetP7');
    将INSERT INTO streets(idcitystreet)VALUES(4,'tokyo','streetT1');
    将INSERT INTO streets(idcitystreet)VALUES(5,'tokyo','streetT2');
    将INSERT INTO streets(idcitystreet)VALUES(6,'tokyo','streetT3');
    将INSERT INTO streets(idcitystreet)VALUES(7,'tokyo','streetT4');
    插入streets(idcitystreet)VALUES(8,'tokyo','streetT5');
    插入streets(idcitystreet)VALUES(9,'tokyo','streetT6');
    插入streets(idcitystreet)VALUES(10,'tokyo','streetT7');
    插入streets(idcitystreet)VALUES(11,'tokyo','streetT8');
    将INSERT INTO streets(idcitystreet)值(12,'tokyo','streetT9');
    插入streets(idcitystreet)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/

    10-11 03:10
    查看更多