Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 01.04.2014
Сообщений: 9
1

Выборка уникальных записей с максимальными датами, и затем выборка по найденому

01.04.2014, 18:52. Показов 2414. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как вообще такой запрос лучше составить?

У меня есть таблица User(id) и Message( id, fromUserId, toUserId, sendDate).
Мне нужно выбрать пользователей у которых есть переписка сообщениями например с пользователем с id=4, при этом они должны быть упорядочены по убыванию, в зависимости от того кто последний присылал сообщение.

Получается что с табл. Message, нужно выбрать user_id = (fromUserId OR toUserId), затем взять максимально новые даты sendDate, но что бы пользователи были уникальными. С этой задачей как раз справляется ORDER BY sendDate DESC, а после GROUP BY user_id ORDER BY sendDate DESC.

В общем эта часть запроса:
SQL
1
2
3
4
5
6
7
8
SELECT mes.*
FROM
(
    (SELECT `fromUserId` AS user_id, sendDate FROM `Message` WHERE `toUserId`=3)
      UNION
    (SELECT `toUserId` AS user_id, sendDate FROM `Message` WHERE `fromUserId`=3)
   ORDER BY sendDate DESC
) AS mes GROUP BY user_id ORDER BY sendDate DESC
Работает так как нужно, но как теперь сделать что бы с полученных user_id и sendDate выбрать Пользователей именно в полученном порядке. Например если в итоге у нас такой запрос возвратил user_id = (4,1,2), то в таком порядке и найти пользователей с id = (4,1,2).

Как так сделать? Помогите пожалуйста!

Я новичок в этих делах, но все таки пробовал сам что то намудрить, получилось так но не работает, я понимаю почему, там GROUP BY не там. )) Но я пытался))

SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT mes.*, u.id, u.login
FROM
  USER AS u,
(
    (SELECT `fromUserId` AS user_id, sendDate FROM `Message` WHERE `toUserId`=3)
      UNION
    (SELECT `toUserId` AS user_id, sendDate FROM `Message` WHERE `fromUserId`=3)
   ORDER BY sendDate DESC
) AS mes GROUP BY user_id ORDER BY sendDate DESC
WHERE
  u.id=mes.user_id
Помогите пожалуйста, как нужно правильно делать такие запросы? Если я как то тупо обяснил что мне нужно спрашивайте я быстро уточню!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2014, 18:52
Ответы с готовыми решениями:

Выборка уникальных записей с условием
Добрый вечер! Есть таблица: prod_id|catalog_id 1|13 1|9 2|13 2|9 3|9

Выборка уникальных IP
Доброе время суток. Не знаю с какой стороны подойти к выборке. в таблице имеем поля date, ip, tag....

Выборка уникальных значений
Есть примерно такая таблица: id value 1 12 1 3 1 6 2 8 2 3 2 6

Выборка уникальных значений
Уменя есть таблица времени посещений каждого пользователя, и вот мне нужно подсчитать общее кол-во...

2
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
01.04.2014, 21:33 2
Лучший ответ Сообщение было отмечено MaksT как решение

Решение

Можно так попробовать (хотя место на диске и жалко): http://sqlfiddle.com/#!2/b6e598/1
MySQL
1
2
3
4
5
6
7
8
9
10
create table Message( 
  id int auto_increment primary key, 
  fromUserId int references Users(id), 
  toUserId int references Users(id), 
  sendDate datetime
  -- индексы увеличивают место на диске и скорость обновлений
  -- но существенно уменьшают скорость поиска
  ,key FT_Dt(fromUserId,toUserId,sendDate) 
  ,key TF_Dt(toUserId,fromUserId,sendDate)
  );
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set @id=4;
 
select g.id, u.name, max(g.sendDate) last_sendDate
from(
  select m.toUserId AS id, max(m.sendDate) sendDate
    from Message m
    where m.fromUserId = @id
    group by m.toUserId -- задействован индекс FT_Dt
  union all
  select n.fromUserId, max(n.sendDate) 
    from Message n
    where n.toUserId = @id
    group by n.fromUserId -- задействован индекс TF_Dt
  )g
natural join Users u -- связь по полю ID
group by g.id -- мало влияет на скорость из-за небольшого объема данных
order by last_sendDate desc;
план выполнения:
IDSELECT_TYPETABLETYPEPOSSIBLE_KEYSKEYKEY_LENREFROWSFILTEREDEXTRA
1PRIMARY ALL    4100Using temporary; Using filesort
1PRIMARYueq_refPRIMARYPRIMARY4g.id1100 
2DERIVEDmrefFT_DtFT_Dt5 4100Using where; Using index
3UNCACHEABLE UNIONnrefTF_DtTF_Dt5 2100Using where; Using index
 UNION RESULT ALL       
1
0 / 0 / 0
Регистрация: 01.04.2014
Сообщений: 9
01.04.2014, 22:14  [ТС] 3
Огромедное спасибо cygapb-007! То что нужно! Я очень Вам благодарен!

Я пока мучился тоже вот наколхозил кое что, оно работает так же но я знаю что это мега тупой запрос)) :

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SET @nn=4;
 
SELECT m.sendDate, u.*
FROM
        (
            (SELECT `fromUserId` AS user_id, sendDate FROM `Message` WHERE `toUserId`=@nn)
                UNION
            (SELECT `toUserId` AS user_id, sendDate FROM `Message` WHERE `fromUserId`=@nn)
                ORDER BY `sendDate` DESC
        ) AS m
    JOIN
        USER AS u
        ON m.user_id = u.id
 
GROUP BY id ORDER BY sendDate DESC
0
01.04.2014, 22:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2014, 22:14
Помогаю со студенческими работами здесь

Выборка уникальных значений
Есть запрос : $result = mysqli_query($db, "SELECT DISTINCT `request` FROM $tb WHERE...

Выборка уникальных значений order by having
Добого времени суток уважаемые форумчане! Проблема касается создания подзапроса для...

Выборка уникальных значений и их сумма
Доброго времени суток, имеется таблица, в котором содержится список городов: Москва, Москва,...

Выборка уникальных сочетаний из 2х полей
Добрый день! Есть таблица id1|id2 1 | 1 2 | 1 3 | 1 1 | 2 2 | 2 1 | 3 5 | 7


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru