MySQL SELECT 8 уникальных пользователей, затем ВЫБЕРИТЕ все записи в пределах этих 8 пользователей, затем ВЫБЕРИТЕ 4 самые последние и доступные записи каждых 8 пользователей? - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть база данных (даты - просто примеры для заказа) ...

 ---------------------
| user | item |  date |
 ---------------------
|    1 |    a |   123 |
|    3 |    b |   124 |
|    1 |    c |   125 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
|    5 |    p |   139 |
|    9 |    q |   140 |
|    7 |    r |   141 |
 ---------------------

Я хотел бы получить все записи до первых 8 уникальных пользователей, что дало бы результаты ...

 ---------------------
| user | item |  date |
 ---------------------
|    1 |    a |   123 |
|    3 |    b |   124 |
|    1 |    c |   125 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
 ---------------------

Затем из этих записей я хотел бы получить самые последние 4 записи на уникального пользователя , чтобы результаты выглядели как ...

 ---------------------
| user | item |  date |
 ---------------------
|    3 |    b |   124 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
 ---------------------

В идеале я мог бы сделать это одним запросом.Самое близкое, что я смог получить, это запрос:

SELECT users, 
GROUP_CONCAT(items) 
FROM db 
GROUP BY users 
ORDER BY date 
LIMIT 8

Но GROUP_CONCAT возвращает все результаты для этого пользователя, а не только сумму в выборе.

У меня естьтакже пытался ...

SELECT users
FROM db AS u1
JOIN (SELECT DISTINCT users FROM db) AS u2 ON u1.users = u2.users

из другого предложения, которое я нашел, но это тоже не сработало.

Я пробовал кучу других вещей, которые я действительно не сохранил, потому чтоони не работали, и я был уверен, что я это пойму, но прошло две недели, и я не приблизился.Если есть какие-нибудь гуру SQL, которые могут указать мне правильное направление, это было бы действительно здорово.Спасибо.

1 Ответ

0 голосов
/ 06 апреля 2019

Надеюсь, это поможет вам.

--get all records up to the first 8 unique users,depending on there first order date
 select distinct a.user,a.date as first_order_date from yourtable as a where 
 a.date = (select MIN(date) from yourtable as b where a.user=b.user) order by a.date LIMIT 8

Затем, используя приведенный выше результат, получите последние 4 записи для каждого уникального пользователя, как показано ниже:

select * from yourtable as t where t.date in 
(select date from yourtable as t2 where t.user=t2.user order by t2.date desc LIMIT 4 ) and 
t.user in (select distinct a.user,a.date as first_order_date from yourtable as a
where a.date = (select MIN(date) from yourtable as b where a.user=b.user) order by a.date LIMIT 8)

Ссылки:

коррелированные подзапросы

Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...