我想从查询中获得以下输出:
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;
答案 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;