Как найти наиболее распространенное значение после объединения трех таблиц - PullRequest
1 голос
/ 13 февраля 2020

Мне нужно написать запрос SQL, который для каждого пользователя будет возвращать имя комнаты, которая была наиболее часто зарезервирована пользователем.

Я создал одну из трех таблиц:

SELECT   User.Name as user_name, Room.Name as room_reser  
FROM     Reservation 
INNER JOIN User ON User.Id = Reservation.UserId 
INNER JOIN Room ON Room.Id = Reservation.RoomId

Таблица 3:

Name          room_rese                             name     common_room
Jack           room_1
Anna           room_2                I need =>      Jack       room_1
Jack           room_1
Anna           room_1                               Anna        room_2
Jack           room_2
Anna           room_2

Я пробовал что-то подобное, но не знаю, как использовать это в данном случае:

SELECT DISTINCT r.user_name, (
    select b.room_reser
    from Reservation b
    where b.user_name = r.user_name
    group by b.user_name, b.roo_reser
    order by count(*) desc
    limit 1
    ) as roo_reser from Reservation r)`

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Если вы используете базу данных, которая поддерживает оконные функции, вы можете сделать это с помощью агрегации и оконной функции rank():

select user_name, room_name
from (
    select   
        us.name as user_name, 
        ro.name as room_name,
        rank() over(partition by re.userid order by count(*) desc) rn
    from reservation re
    inner join user us on us.id = re.userid 
    inner join room ro on ro.id = re.roomid
    group by re.userid, re.roomid, us.name, ro.name
) t
where rn = 1

Внутренний запрос агрегирует по имени пользователя и комнате и ранжирует комнаты по пользователь. Внешние запросы фильтруются в верхней комнате на пользователя. Если есть связи (ie две самые зарезервированные комнаты пользователя имеют одинаковое количество резервирований), то будут отображаться обе - если вы хотите одну запись, даже если есть связи, вы можете добавить другой критерий сортировки, чтобы разорвать t ie.


Если ваша база данных не поддерживает оконную функцию, вы можете попробовать фильтровать в предложении having совокупный коррелированный подзапрос:

select   
    us.name as user_name, 
    ro.name as room_name
from reservation re
inner join user us on us.id = re.userid 
inner join room ro on ro.id = re.roomid
group by us.name, ro.name
having count(*) = (
    select count(*) 
    from reservation re1 
    where re1.userid = re.userid
    group by re1.roomid
    order by count(*) desc
    limit 1
)
0 голосов
/ 13 февраля 2020
SELECT   DISTINCT User.Name as user_name, Room.Name as room_reser  
FROM     Reservation 
INNER JOIN User ON User.Id = Reservation.UserId 
INNER JOIN Room ON Room.Id = Reservation.RoomId 
GROUP BY user_name, room_reser 
ORDER BY COUNT(room_reser)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...