MYSQL один запрос для получения COUNT (DISTINCT columnName) с группировкой по и упорядочением по

0

У меня есть класс сущности

public class TeklaEventE {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private Integer projectId;
    private Integer drawingId;
    private Integer userId;
    private String eventType;
    private LocalDateTime eventDate; 
    private LocalDateTime modifiedDate; 
    private String projectName;
    private String userName;
    private transient int noOfUser;    
    // getter setter
}

Я хочу получить *, COUNT(DISTINCT userId), группируя projectId, заказывая eventDate

Я пробовал следующие запросы

  1. SELECT *,COUNT(DISTINCT userId) as noOfUser FROM teklaevent group by projectId order by eventDate desc; он дает правильный счет, но сначала он запускает group by затем order by но мне нужна последняя строка, у которой есть отдельный projectId. Затем я попробую второй запрос, как было предложено

  2. select * FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc; Это дает идеальную строку, в которой я нуждаюсь, потому что eventDate всегда текущая дата. Но когда я пытаюсь получить COUNT(DISTINCT userId) из нижнего запроса.

  3. select *,COUNT(DISTINCT userId) as noOfUser FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc; он не дает мне правильный результат.

Как это сделать в одном запросе?

  • 0
    Вы не можете сделать SELECT * при использовании GROUP BY . Это не имеет смысла, поэтому подумайте, что вы пытаетесь сделать. Причина: GROUP BY projectId означает возвращать только одну строку для каждого отдельного значения projectId , но поскольку в таблице может быть много строк с одинаковым значением projectId , какое из многих значений, например, для drawingId должно быть возвращено?
  • 0
    Я считаю, что третий вариант использует GROUP BY правильно. Может быть, ORDER BY eventDate desc просто нужно перейти в подзапрос?
Показать ещё 1 комментарий
Теги:

2 ответа

0
Лучший ответ

Это работает для меня

select a.*, t.noOfUser from teklaevent a inner join ( select max(id) maxid, count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.id = t.maxid;

1

Вы можете использовать соединение в подзапросе для подсчета

select a.*, t.noOfUser 
from  teklaevent
inner join (

  select projectId , count(distinct userId) noOfUser
  from  teklaevent
  group by projectId
) t a.projectId = t.projectId
  • 0
    это не работает .. select a.*, t.noOfUser from teklaevent a inner join ( select projectId , count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.projectId = t.projectId; Вернуть все строки
  • 1
    В этой работе select a.*, t.noOfUser from teklaevent a inner join ( select max(id) maxid, count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.id = t.maxid;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню