Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
Здравствуйте!
Подскажите пожалуйста, как выбрать уникальные значения из двух полей, где могут содержаться одинаковые id?
Есть таблица сообщений, где есть id сообщения, from_id и to_id.
Необходимо получить пять уникальных значений по двум полям from_id и to_id, где from_id=мой id (т.е. пишу я) и to_id=мой id (где пишут мне), и где id отсортировано по убыванию (от большего к меньшему).
Нужен конкретный запрос.
14 дек 15, 02:53    [18555505]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17886
Иосиф111
где from_id=мой id (т.е. пишу я) и to_id=мой id (где пишут мне)

Видимо, всё-таки ИЛИ?

Иосиф111
Необходимо получить пять уникальных значений по двум полям from_id и to_id

SELECT DISTINCT CASE WHEN from_id=my_id THEN to_id ELSE from_id END
FROM `table`
WHERE from_id=my_id OR to_id=my_id
ORDER BY 1 DESC LIMIT 5
14 дек 15, 09:23    [18555801]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
Akina,

Akina
Видимо, всё-таки ИЛИ?


всё верно.

Akina
ORDER BY 1 DESC


А что за 1? это разве группировка по id?

Мне нужно получить id уникальных авторов (from_id и to_id) с самыми последними сообщениями (id).
14 дек 15, 10:31    [18556090]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
Akina,

Akina
Видимо, всё-таки ИЛИ?

всё верно.

Akina
ORDER BY 1 DESC

А что за 1? это разве сортировка по id?

Мне нужно получить id уникальных авторов (from_id и to_id) с самыми последними сообщениями (id).
14 дек 15, 10:33    [18556107]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
tanglir
Member

Откуда:
Сообщений: 28970
Иосиф111
А что за 1? это разве сортировка по id?
сортировка по полю выборки номер 1
в данном случае по ид собеседника

Иосиф111
с самыми последними сообщениями (id).
ну так с этого и надо было начинать: FAQ: Выборка первой/последней записи в группах
14 дек 15, 11:21    [18556374]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
tanglir, сходил по вашей ссылке, но не смог понять, где решение под мой случай. Недостаток серого вещества видимо сказывается.

Я так понимаю у меня должен быть примерно такой запрос, судя по ответам в тему:
$qqq="SELECT DISTINCT CASE WHEN from_user_id='$my' THEN to_user_id ELSE from_user_id END FROM chat WHERE from_user_id='$my' OR to_user_id='$my' ORDER BY chat.id DESC LIMIT 5";

но print_r полученного массива выдаёт вот что (а должен уникальные id пользователей):
Array ( [0] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 56 ) [1] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 81 ) [2] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 66 ) [3] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 24 ) [4] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 20 ) )

причём даже в этом массиве сообщения расположились без учёта сортировки по id сообщения начиная от большего id к меньшему
14 дек 15, 11:44    [18556509]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
tanglir
Member

Откуда:
Сообщений: 28970
Иосиф111
но print_r полученного массива выдаёт вот что (а должен уникальные id пользователей)
<...>
причём даже в этом массиве сообщения расположились без учёта сортировки по id сообщения начиная от большего id к меньшему
Иосиф111, то есть выполнить запрос вы смогли, а понять, что он делает, не очень.
Это и есть уникальные ид пользователей-собеседников. Ровно 5 штук (или меньше, если столько не наберётся). И расположились они так потому что... ну как бы объяснить. Проще спросить, за каким ***** вы пытаетесь сортировать по айдишнику записи, который после такого distinct-а, как в запросе, будет недетерминирован.
Вообще, если задача стоит именно так
Иосиф111
получить id уникальных авторов (from_id и to_id) с самыми последними сообщениями (id).
, то это одним запросом без всяких подзапросов решается
банальный max(id) + group by тот_самый_case + order by max_id desc limit 5
14 дек 15, 13:07    [18556917]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
tanglir
то это одним запросом без всяких подзапросов решается
банальный max(id) + group by тот_самый_case + order by max_id desc limit 5


tanglir, не сочтите за труд, пожалуйста, напишите запрос применительно к моему случаю. Бьюсь над этой задачей, не могу решить. Мозги кипят, а выхлоп нулевой.
14 дек 15, 13:19    [18557001]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
tanglir
Member

Откуда:
Сообщений: 28970
Иосиф111,

select тот_самый_case,max(id)
from chat
group by 1
order by 2 desc limit 5
14 дек 15, 13:26    [18557059]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
tanglir,
благодарю вас за помощь.

вот мой запрос:
$qqq="SELECT DISTINCT CASE WHEN from_user_id='$my' THEN to_user_id ELSE from_user_id END,max(id) FROM chat WHERE from_user_id='$my' OR to_user_id='$my' group by 1 order by 2 DESC LIMIT 5";


дал такой print_r:
Array ( [0] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 20 [max(id)] => 17 ) [1] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 56 [max(id)] => 14 ) [2] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 81 [max(id)] => 13 ) [3] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 66 [max(id)] => 12 ) [4] => Array ( [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] => 24 [max(id)] => 11 ) )


все при первом осмотре верно. Правда я не совсем понимаю каким образом мне вытянуть из этого массива значения переменных по ключу?
тут ведь ключ везде разный - например [CASE WHEN from_user_id='7' THEN to_user_id ELSE from_user_id END] и тп.

когда я пытаюсь получить значение по ключу to_user_id, то мне выдаётся ошибка "Message: Undefined index: to_user_id"
14 дек 15, 13:41    [18557182]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
tanglir
Member

Откуда:
Сообщений: 28970
Картинка с другого сайта. (c)Hett
Разберитесь, что делает этот case - и поймёте, что(и как) делает запрос.
14 дек 15, 13:50    [18557248]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
tanglir,
вроде бы разобрался. я добавил индексы к выбираемым полям и по ним получаю значения теперь

$qqq="SELECT DISTINCT CASE WHEN from_user_id='$my' THEN to_user_id ELSE from_user_id END as usid,max(id) as id FROM chat WHERE from_user_id='$my' OR to_user_id='$my' group by 1 order by 2 DESC LIMIT 5";


всё правильно сделал?
14 дек 15, 13:53    [18557265]     Ответить | Цитировать Сообщить модератору
 Re: Выборка уникальных значений из двух полей, где содержатся id  [new]
Иосиф111
Member

Откуда:
Сообщений: 8
tanglir, благодарю вас за помощь. голова!
14 дек 15, 18:16    [18558938]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить