Как написать запрос, который получает 3 ответа для каждого пользователя в моей таблице пользователей? - PullRequest
2 голосов
/ 20 марта 2020

Я хочу отобразить три ответа от каждого пользователя, которые есть в моей таблице пользователей, поэтому, например, если у меня есть 3 пользователя, и каждый из них ответил на, скажем, 10 сообщений, я хочу, чтобы мой запрос получал только 9 ответов, а не все ответы в моей таблице messages_reply.

вот что я попробовал:

     $replyquery="select * 
     from messages_reply 
     LEFT JOIN users 
     ON messages_reply.from_id=users.id 
     GROUP BY messages_reply.id LIMIT 3";

я знаю, что то, что я написал, означает, что я получу только 3 ответа, так как мне принести 3 ответа от каждого пользователя в моей таблице пользователей?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Запрос не проверен, просто концепция

SELECT *
FROM users
LEFT JOIN (
    SELECT *
    FROM messages_reply
    WHERE from_id = users.id
    ORDER BY <your wanted order field> DESC
    LIMIT 3) replies
    ON users.id = replies.from_id

1 голос
/ 20 марта 2020

Во многих базах данных вы можете использовать row_number() для этого:

select *
from (
    select mr.*, u.*, row_number() over(partition by u.id order by mr.id desc) rn
    from messages_reply mr
    inner join users u on mr.from_id = u.id 
) t
where rn <= 3

Если вы используете MySQL <8.0, как я подозреваю из-за слабого использования <code>group by в вашем запросе:

select mr.*, u.*
from messages_reply mr
inner join users u on mr.from_id = u.id 
where mr.id >= (
    select mr1.id
    from messages_reply mr1
    where mr1.from_id = u.id 
    order by mr1.id desc
    limit 2, 1
)

Это дает вам 3 сообщения с наибольшим значением id для каждого пользователя.

...