SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.11.2017 22:47:27

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

Доброго времени суток, в общем, столкнулся с такой проблемой. Нужно вывести данные из таблицы, отфильтровав по уникальности. Скрин:
https://image.prntscr.com/image/jd4zYdAeQdG-0vRbOKNluA.jpeg (тут тот же скрин, на случай всякий, а то ссылка  может стать нерабочей https://prnt.sc/hdgqy6 )
Использую запрос:

SELECT * FROM (SELECT * FROM `chat` ORDER BY `id` DESC LIMIT 20) AS select_result WHERE `nic`='$nic' GROUP BY `nic`, `admin`
UNION
SELECT * FROM (SELECT * FROM `chat` ORDER BY `id` DESC LIMIT 20) AS select_result2 WHERE `admin`='$nic' GROUP BY `nic`, `admin` ORDER BY `id` DESC

вместо $nic сейчас использую Рушнов 321, но вместо него будет любой другой показатель, подгружаемый с помощью php
Но остаются неуникальные (в моем случае) строки. Неуникальные пары подчеркнуты зеленым и красным. Другими словами: nic -> admin должен быть неравен admin -> nic. И какая из этих двух записей встречается последней - она должна отсекаться.
Грубо говоря, нужно отсечь 179 и 181 строку.
Статью про группировку в MySQL читал, очень познавательно))). но там используется один столбец, а у меня их два
Быть может у меня совсем не правильный запрос. Помогите, плиз

Отредактированно Ilya_Ru (21.11.2017 23:09:33)

Неактивен

 

#2 21.11.2017 22:53:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

приведите пример тестовы данных в виде
create table ...
insert into ...
и какой должен быть результат

Неактивен

 

#3 21.11.2017 23:00:53

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

приведите пример тестовы данных в виде
create table ...
insert into ...
и какой должен быть результат

Прикрепил скрин в свой вопрос. Надеюсь, понятно))).
Сейчас прикреплю и то, что Вы просите. Прошу прощения за задержки, С планшета немного неудобно

Отредактированно Ilya_Ru (21.11.2017 23:04:10)

Неактивен

 

#4 21.11.2017 23:12:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

если большему времени соответствует больший id, то

select max(id) from (
select id, if(`nic`<`admin`, `nic`, `admin`) as `nic`, if(`nic`<`admin`, `admin`, `nic`) as `admin` from `chat`)
group by `nic`,`admin`;

Неактивен

 

#5 21.11.2017 23:55:42

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

приведите пример тестовы данных в виде
create table ...
insert into ...
и какой должен быть результат

вот тестовые данные:

create table test_chat (id int(11), nic text, `date` datetime, sms text, admin text);
insert into test_chat values (1, 'Рушнов 321', '2012-10-14 11:21:22', 'привет, я 321', 'Админ'),(2, 'Админ', '2012-11-12 18:53:26', 'а я админ, открыл переписку и на письмо был получен ответ, поэтому мое сообщение не нужно отображать', 'Рушнов 321'),(3, 'Вася', '2012-11-15 16:51:08', 'при переписке с Рушнов 321 я не нужен, так как к нему никаким боком не отношусь, пишу админу', 'Админ'),(4, 'Петя', '2012-11-16 12:57:18', 'а я открыл переписку с Рушнов 321, и я должен отображаться, я ж уникален', 'Рушнов 321'),(5, 'Рушнов 321', '2012-11-20 2:07:16', 'написал письмо Кириллу, покажите мое сообщение ', 'Кирилл'),(7, 'Рушнов 321', '2012-11-21 2:07:16', 'написал Роме первый, сообщение отсекаем ', 'Рома'),(8, 'Рома', '2012-11-22 22:07:16', 'рома ответил Рушнов 321', 'Рушнов 321');
SELECT * FROM test_chat;

Неактивен

 

#6 22.11.2017 00:10:02

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

если большему времени соответствует больший id, то

select max(id) from (
select id, if(`nic`<`admin`, `nic`, `admin`) as `nic`, if(`nic`<`admin`, `admin`, `nic`) as `admin` from `chat`)
group by `nic`,`admin`;

к сожалению, выдает ошибку, пока не понял, почему #1248 every derived table must have its own alias

Неактивен

 

#7 22.11.2017 00:11:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

mysql> select t1.* from test_chat t1 join
(select max(id) id from (select id, if(`nic`<`admin`, `nic`, `admin`) as `nic`, if(`nic`<`admin`, `admin`, `nic`) as `admin` from `test_chat`) t
group by `nic`,`admin`) t2 using(id)\G
*************************** 1. row ***************************
   id: 2
  nic: Админ
 date: 2012-11-12 18:53:26
  sms: а я админ, открыл переписку и на письмо был получен ответ, поэтому мое со
общение не нужно отображать
admin: Рушнов 321
*************************** 2. row ***************************
   id: 3
  nic: Вася
 date: 2012-11-15 16:51:08
  sms: при переписке с Рушнов 321 я не нужен, так как к нему никаким боком не от
ношусь, пишу админу
admin: Админ
*************************** 3. row ***************************
   id: 4
  nic: Петя
 date: 2012-11-16 12:57:18
  sms: а я открыл переписку с Рушнов 321, и я должен отображаться, я ж уникален
admin: Рушнов 321
*************************** 4. row ***************************
   id: 5
  nic: Рушнов 321
 date: 2012-11-20 02:07:16
  sms: написал письмо Кириллу, покажите мое сообщение
admin: Кирилл
*************************** 5. row ***************************
   id: 8
  nic: Рома
 date: 2012-11-22 22:07:16
  sms: рома ответил Рушнов 321
admin: Рушнов 321
5 rows in set (0.00 sec)

 

Неактивен

 

#8 22.11.2017 01:14:23

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

mysql> select t1.* from test_chat t1 join
(select max(id) id from (select id, if(`nic`<`admin`, `nic`, `admin`) as `nic`, if(`nic`<`admin`, `admin`, `nic`) as `admin` from `test_chat`) t
group by `nic`,`admin`) t2 using(id)\G
*************************** 1. row ***************************
   id: 2
  nic: Админ
 date: 2012-11-12 18:53:26
  sms: а я админ, открыл переписку и на письмо был получен ответ, поэтому мое со
общение не нужно отображать
admin: Рушнов 321
*************************** 2. row ***************************
   id: 3
  nic: Вася
 date: 2012-11-15 16:51:08
  sms: при переписке с Рушнов 321 я не нужен, так как к нему никаким боком не от
ношусь, пишу админу
admin: Админ
*************************** 3. row ***************************
   id: 4
  nic: Петя
 date: 2012-11-16 12:57:18
  sms: а я открыл переписку с Рушнов 321, и я должен отображаться, я ж уникален
admin: Рушнов 321
*************************** 4. row ***************************
   id: 5
  nic: Рушнов 321
 date: 2012-11-20 02:07:16
  sms: написал письмо Кириллу, покажите мое сообщение
admin: Кирилл
*************************** 5. row ***************************
   id: 8
  nic: Рома
 date: 2012-11-22 22:07:16
  sms: рома ответил Рушнов 321
admin: Рушнов 321
5 rows in set (0.00 sec)

 

Ухты! Не ожидал подобного результата!!!))) Большое спасибо! А как можно выкинуть лишнюю выборку 2 row (Вася и Админ)? write nic='Рушнов 321' or admin='Рушнов 321' вроде как при подобной конструкции использовать нельзя(((
В примере только row 2 лишние, а на практике подобных данных будет много

Отредактированно Ilya_Ru (22.11.2017 01:16:46)

Неактивен

 

#9 22.11.2017 01:27:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

почему? можно:
... as `admin` from `test_chat` where `nic`='Рушнов 321' or `admin`='Рушнов 321' ) t
group by `nic`,`admin`) t2 using(id)

Неактивен

 

#10 22.11.2017 01:42:34

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

почему? можно:
... as `admin` from `test_chat` where `nic`='Рушнов 321' or `admin`='Рушнов 321' ) t
group by `nic`,`admin`) t2 using(id)

И для полного счастья не хватает order by `date` asc smile . Не подскажете, куда вставить? smile Чтобы рассортировалось все не по иду, а по дате smile
а то в рабочей базе порядок какой-то немного странный получился, не по иду и не по дате. Быть может это из за уникального поля id? https://image.prntscr.com/image/LWBRV46ZT2G1R9GTlnA6TQ.jpeg
UPD: Отлично! Разобрался сам. в самом конце дописал ORDER BY `t1`.`date` ASC

Отредактированно Ilya_Ru (22.11.2017 02:00:20)

Неактивен

 

#11 22.11.2017 02:00:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

в конце запроса, но всё вышеприведенное имеет смысл

vasya написал:

если большему времени соответствует больший id

Неактивен

 

#12 22.11.2017 02:04:52

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

vasya написал:

в конце запроса, но всё вышеприведенное имеет смысл

vasya написал:

если большему времени соответствует больший id

Большое человеческое спасибо! Вы даже не представляете, как сильно Вы мне помогли! Просто нет слов, одни положительные эмоции))). Спасибо! smile

Неактивен

 

#13 28.03.2018 22:57:39

Ilya_Ru
Участник
Зарегистрирован: 21.11.2017
Сообщений: 10

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

Здравствуйте. Такой интересный вопрос, а как себя будет вести подобный запрос на базе данных размером в 4gb MariaDB, где тысячи записей? Все столбцы идентичны приведенным ранее. Есть подозрение, что при постепенном наполнении данных, запрос начинает выполняться дольше...

Отредактированно Ilya_Ru (28.03.2018 23:01:14)

Неактивен

 

#14 29.03.2018 14:42:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

зависит от параметров сервера, настроек, нагрузки, индексов, ...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson