我正在寻找过滤我的查询以获取所有具有ID关系的名称

时间:2019-05-19 19:23:02

标签: java mysql sql

我想从查询中获得以下输出:

CODE  NAME  MANAGER
 1    John  Ely
      Paul
      Elsa  Anahid
 2    Raul  Ely
      Rosa  Paul
      Ahmad

我该如何订购?

John,Paul and Elsa belogns to CODE 1  
Raul,Rosa Ahmad  belong to CODE 2

我尝试过但是我得到了:

CODE  NAME  MANAGER
 1    John  Ely
 1    Paul
 1    Elsa  Anahid
 2    Raul  Ely
 2    Rosa  Paul
 2    Ahmad

或者这个:

CODE  NAME  MANAGER
 1    John  Ely
 2    Rosa  Paul

查询:

SELECT ad.CODE,em.NAME,em.MANAGER
FROM employess em INNER JOIN
     address ad 
     ON ad.CODE = em.CODE 
GROUP BY ad.CODE;

3 个答案:

答案 0 :(得分:1)

正如Gordon Linoff所建议的那样,在表示层中进行修改确实更好。

但是,使用SQL也可以实现。

SELECT
  IF(
    em.NAME = (select ems.NAME from employees ems where ems.CODE = em.CODE order by em.NAME LIMIT 1),
    em.CODE,
    ''
    ) as CODE,
  em.NAME,
  em.MANAGER
FROM employess em
INNER JOIN address ad ON ad.CODE = em.CODE
ORDER BY em.CODE, em.NAME;

仅当名称在表employess中唯一时才有效,否则更好地比较子查询中的uniq ID。 是的,这个子查询给数据库增加了不必要的负载。因此,如果性能很重要-保持查询简单,并在Java中处理CODE字段。

答案 1 :(得分:0)

假设您有简单的POJO类:

public class Employee {
    private Long code;
    private String name;
    private String manager;

    \\ constructor, getters and setters ...
}

和SQL查询:

SELECT ad.CODE,em.NAME,em.MANAGER
FROM employess em INNER JOIN
     address ad 
     ON ad.CODE = em.CODE 

您可以使用JDBC或其他JDBC插件(Spring Data,Hibernate等)进行查询。此后,您将获得Employee列表,并且可以简单地按代码对员工进行分组:

List<Employee> employees = // Recieving employees from database
Map<Long, List<Employee> groupedEmployeesByCode = employees.stream()
    .collect(Collectors.groupingBy(Employee::getCode()));

我认为,可以使用本机SQL进行此操作,但我无法提出一些建议。

答案 2 :(得分:0)

您可以模拟ditto格式,但最好在应用程序中格式化输出。

SELECT IF(@ditto = (@ditto := ad.CODE)
         , ''
         , ad.CODE
         ) AS CODE
     , em.NAME
     , em.MANAGER
 FROM employess AS em 
 JOIN address   AS ad ON ad.CODE = em.CODE 
WHERE ((@ditto := 0) OR 1)
ORDER BY ad.CODE;