Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅当其中一个值具有空字段时,才在表中选择GROUP_BY和GROUP_CONCAT相同的值_Mysql_Sql_Group Concat - Fatal编程技术网

Mysql 仅当其中一个值具有空字段时,才在表中选择GROUP_BY和GROUP_CONCAT相同的值

Mysql 仅当其中一个值具有空字段时,才在表中选择GROUP_BY和GROUP_CONCAT相同的值,mysql,sql,group-concat,Mysql,Sql,Group Concat,我有一张满是姓名和地址的桌子。我想合并(group_concat)所有对城市状态和名称具有相同值的行,但前提是其中一个地址为空值。例如,我可能有以下表格: name | addr | city | state | phone jon snow | 123 got st | la | CA | 1234567890 jon snow | NULL | la | CA | 1225556789 walker | 777 d

我有一张满是姓名和地址的桌子。我想合并(group_concat)所有对城市状态和名称具有相同值的行,但前提是其中一个地址为空值。例如,我可能有以下表格:

name     |    addr    |  city  | state  | phone 

jon snow | 123 got st |  la    | CA     | 1234567890
jon snow | NULL       |  la    | CA     | 1225556789
walker   | 777 diff ln|  la    | CA     | 4556678899
walker   |456 crown rd|  la    | CA     | 33344455566
我希望结果是:

name     |    addr    |  city  | state  | phone

jon snow | 123 got st |  la    | CA     | 1234567890,1225556789
walker   | 777 diff ln|  la    | CA     | 4556678899
walker   |456 crown rd|  la    | CA     | 33344455566
目前我正在使用以下命令:

SELECT name, group_concat(distinct(addr)) as addr, city, state, group_concat(distinct phone) as phone from got_table group by name, city, state having count(*) >1;
即使有两个非空地址,也会将具有相同名称、城市、州的所有地址组合在一起。上述声明的结果如下:

name     |    addr                  |  city  | state  | phone

jon snow | 123 got st               |  la    | CA     | 1234567890,1225556789
walker   | 777 diff ln, 456 crown rd|  la    | CA     | 4556678899, 33344455566

是否有一种方法仅当行的地址之一为空时才合并,并且仅当只有两行匹配时才执行此组合并

您可以尝试使用子查询按
大小写分组

检查
addr
列是否
NULL
get

  • addr
    为空获取
    MAX
    值或您的expect group by concat值
  • addr
    不为空get
    addr
  • 像这样

    CREATE TABLE got_table(
       name varchar(50),
       addr varchar(50),
      city varchar(50),
        state varchar(50),
        phone varchar(50)
    ); 
    
    
    insert into got_table values ('jon snow','123 got st'  ,'la', 'CA', '1234567890');
    insert into got_table values ('jon snow',NULL          ,'la', 'CA', '1225556789');
    insert into got_table values ('walker','777 diff ln' ,'la', 'CA'  , '4556678899');
    insert into got_table values ('walker','456 crown rd','la', 'CA'  , '33344455566');
    
    查询1

    SELECT name,
           case when addr is null then
           (
             SELECT MAX(tt.addr) 
             FROM got_table tt
             WHERE t1.name = tt.name 
             and t1.city = tt.city 
             and t1.state = tt.state
           ) else addr end as address,
           city, 
           state, 
           group_concat(distinct phone) as phone 
    from got_table t1
    group by name, city, state,address
    
    |     name |      address | city | state |                 phone |
    |----------|--------------|------|-------|-----------------------|
    | jon snow |   123 got st |   la |    CA | 1225556789,1234567890 |
    |   walker | 456 crown rd |   la |    CA |           33344455566 |
    |   walker |  777 diff ln |   la |    CA |            4556678899 |
    

    SELECT name,
           case when addr is null then
           (
             SELECT MAX(tt.addr) 
             FROM got_table tt
             WHERE t1.name = tt.name 
             and t1.city = tt.city 
             and t1.state = tt.state
           ) else addr end as address,
           city, 
           state, 
           group_concat(distinct phone) as phone 
    from got_table t1
    group by name, city, state,address
    
    |     name |      address | city | state |                 phone |
    |----------|--------------|------|-------|-----------------------|
    | jon snow |   123 got st |   la |    CA | 1225556789,1234567890 |
    |   walker | 456 crown rd |   la |    CA |           33344455566 |
    |   walker |  777 diff ln |   la |    CA |            4556678899 |
    

    如果有三行具有相同的城市和州,并且其中一行在
    addr
    中具有
    null
    值,您希望发生什么?是否应返回两个带有非空
    addr
    的行,还是仅返回其中一行?此外,空
    addr
    行的
    电话应继续执行这两个非空
    addr
    行中的哪一行?也就是说,如果您的数据中也有这一行
    jon snow | 425 Kings way | la | CA | 1234567899
    ,那么结果应该是什么?我认为只有当只有两个地址时才会合并,一个是空的,另一个不是空的@ashermaxium