【问题标题】:How Remove duplicate column value after JOIN in MYSQL?如何在 MYSQL 中 JOIN 后删除重复的列值?
【发布时间】:2016-12-11 07:41:43
【问题描述】:

我想使用连接从多个表中获取数据。 它给出了唯一的行,但列值是重复的,并且 我无法删除重复的值,怎么办?

这些是我的桌子

表A

A_ID    A_NAME      
-----   -------
1       ONE         
2       TWO         
3       THREE       

表 B

A_ID    B_ID    CAT         
-----   -----   --------
1       1       CRICKET     
1       2       FOOTBALL    
2       3       HOCKEY      
3       4       TENISH      
3       7       BASE BALL   

表C

B_ID    NAME
------  ------
1       ASN
1       MARK
1       JOHN
2       JACKY
3       RAJ
3       SAM

预期输出

A_ID    A_NAME  B_ID    CAT         NAME
-----   ------  -----   -------     ------
1       ONE     1       CRICKET     ASN
                                    MARK
                                    JOHN
                2       FOOTBALL    JACKY
2       TWO     3       HOCKEY      RAJ
                                    SAM
3       THREE   4       TENISH
                7       BASEBALL

查询:-

SELECT   A.A_ID
        ,A.A_NAME
        ,B.B_ID 
        ,B.CAT          
        ,C.NAME
FROM     A,B,C 
WHERE    A.A_ID = B.B_ID 
AND      B.B_ID = C.C_ID 
GROUP BY A.A_ID,B_B_ID;

【问题讨论】:

  • 在表现层做。
  • 我已经完成了,但我想在 db 中完成?
  • 今日提示:切换到现代显式 JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。
  • 分组依据无效。不会在较新的 MySQL 版本中执行(除非在兼容模式下。)一般 GROUP BY 规则说:如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是一个集合的参数功能!
  • 好的,但是任何人都可以帮助我如何使用查询来做到这一点

标签: mysql sql mariadb rdbms


【解决方案1】:

not 可能 在我看来毫无意义。你可以做出这样的输出

A_ID    A_NAME  B_ID    CAT     NAME
 1        ONE    1    CRICKET   ASN
 1        ONE    1    CRICKET   MARK
 1        ONE    1    CRICKET   JOHN
 1        ONE    2    FOOTBALL  JACKY
 2        TWO    3    HOCKEY    RAJ
 2        TWO    3    HOCKEY    SAM
 3       THREE   4    TENISH    
 3       THREE   7    BASEBALL

使用一个非常简单的查询:

select
  a.a_id, a.a_name, b.b_id, b.cat, c.name
from
  table_a a join
  table_b b on b.a_id = a.a_id left join
  table_c c on c.b_id = b.b_id
order by
  a.a_id, b.b_id, c.name

您可以在前端轻松解析它。您还可以使用 group_concat 将具有相同 a_id 和 b_id 的名称连接到一个逗号分隔的列表中。

如果你坚持(需要添加人工id才能加入上一行):

set @rank1 := 0;
set @rank2 := 1;
select
  case when t2.a_id is null or t2.a_id <> t1.a_id then t1.a_id else null end a_id,
  case when t2.a_name is null or t2.a_name <> t1.a_name then t1.a_name else null end a_name,
  case when t2.b_id is null or t2.b_id <> t1.b_id then t1.b_id else null end b_id,
  case when t2.cat is null or t2.cat <> t1.cat then t1.cat else null end cat,
  t1.name
from
  (select
    a.a_id, a.a_name, b.b_id, b.cat, c.name, @rank1 := @rank1 + 1 as rank
  from
    table_a a join
    table_b b on b.a_id = a.a_id left join
    table_c c on c.b_id = b.b_id
  order by
    a.a_id, b.b_id, c.name
  ) t1 left join
  (select
    a.a_id, a.a_name, b.b_id, b.cat, c.name, @rank2 := @rank2 + 1 as rank
  from
    table_a a join
    table_b b on b.a_id = a.a_id left join
    table_c c on c.b_id = b.b_id
  order by
    a.a_id, b.b_id, c.name
  ) t2 on t2.rank = t1.rank
order by
  t1.rank
;

【讨论】:

  • 在应用程序代码中会容易得多!
猜你喜欢
  • 2019-01-18
  • 2019-02-03
  • 2017-09-12
  • 2018-06-28
  • 1970-01-01
  • 2016-08-13
  • 2013-09-19
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多