SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 09.08.2015 15:58:52

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

сортировка в GROUP BY

Добрый день, вот почитал по этой теме - http://sqlinfo.ru/forum/viewtopic.php?id=6240, понял что связано с моей проблемой, но решить не могу
Усложняет еще в добавок то, что запрос аж с тремя таблицами
Есть запрос
$resultNote = mysql_query("SELECT
               `like_note`.`l_user_id`, `l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender`
               FROM
               `like_note`,
               `notes`,
               `users`
               WHERE
               `like_note`.`l_note_id` = `notes`.`id`
               and
               `like_note`.`l_user_id` = `users`.`id`
               and
               `users`.`time_del_ank` = ''
               and
               `users`.`id` != '{$myrow_user['id']}'
               GROUP BY `like_note`.`l_note_id`
               ORDER BY `like_note`.`l_date` DESC
               LIMIT 40", $db );
Работает как надо, но нужно что бы GROUP BY сортировался в обратном порядке...

Неактивен

 

#2 09.08.2015 21:43:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: сортировка в GROUP BY

Не очень понятно, что значит «чтобы GROUP BY сортировался в обратном порядке?» Оно сортируется по l_date. Если Вам нужно еще сортировать по группировке, то нужно явно об этом написать. Как-нибудь так:

ORDER BY l_note_id, l_date DESC

Тогда записи будут выдаваться в порядке группировки (а внутри уже по дате), ну и можно добавить слово DESC, если нужен другой порядок.

Неактивен

 

#3 10.08.2015 21:59:49

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

l_user_id     l_note_id     l_date
201            5                Дата 3
202            5                Дата 2
203            5                Дата 1

Общий запрос сортирует правильно, по l_date, но в самой группе после группировки тоже должен сортировать по l_date
т.е. для группы 5 должна вывестись запись где l_user_id = 201, а выводится или 202 или 203

Неактивен

 

#4 11.08.2015 07:34:28

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

Re: сортировка в GROUP BY

вы правильно указали нужную вам ссылку smile
сначала нужно получить пару  l_note_id, max(l_date) затем остальные поля.

вариант в лоб это

select ... from
(SELECT
               `like_note`.`l_user_id`, max(`l_date`)
               FROM
               `like_note`,
               `notes`,
               `users`
               WHERE
               `like_note`.`l_note_id` = `notes`.`id`
               and
               `like_note`.`l_user_id` = `users`.`id`
               and
               `users`.`time_del_ank` = ''
               and
               `users`.`id` != '{$myrow_user['id']}'
               GROUP BY `like_note`.`l_note_id`
               LIMIT 40) as t JOIN `like_note`, `notes`, `users`...

возможно подзапрос можно упростить, это зависит от ваших данных.

Неактивен

 

#5 11.08.2015 13:43:07

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

Все таки мыслю я в правильном направлении)))
vasya, если вас не затруднит, то помоги пожалуйста переделать мой запрос на такой, так как я такой сложный запрос с JOIN не осилю)

Неактивен

 

#6 12.08.2015 11:03:13

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

Re: сортировка в GROUP BY

select
               t.`l_user_id`, t.`l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender`
from
(SELECT
               `like_note`.`l_user_id`, max(`l_date`) as l_date
               FROM
               `like_note`,
               `notes`,
               `users`
               WHERE
               `like_note`.`l_note_id` = `notes`.`id`
               and
               `like_note`.`l_user_id` = `users`.`id`
               and
               `users`.`time_del_ank` = ''
               and
               `users`.`id` != '{$myrow_user['id']}'
               GROUP BY `like_note`.`l_note_id`
               LIMIT 40) as t, `notes`, `users`
where
               `t`.`l_note_id` = `notes`.`id`
               and
               `t`.`l_user_id` = `users`.`id`
 

Неактивен

 

#7 12.08.2015 16:07:57

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

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

Неактивен

 

#8 13.08.2015 15:00:17

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

Re: сортировка в GROUP BY

приведите набор тестовых данных в виде
create table
insert into
чтобы можно было проверить

Неактивен

 

#9 13.08.2015 15:57:58

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

извините за глупый вопрос, но это как?

Неактивен

 

#10 14.08.2015 09:06:42

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

Re: сортировка в GROUP BY

набор команд на создание таблиц и заполнение их тестовыми данными, чтобы можно было воспроизвести у себя.
пример http://sqlinfo.ru/forum/viewtopic.php?pid=40086#p40086

Неактивен

 

#11 17.08.2015 21:45:40

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

create table users(id int, nik varchar(20), url varchar(100), avatar varchar(255), gender int, time_del_ank varchar(10)) DEFAULT CHARSET=utf8;

create table notes(id int, id_user int) DEFAULT CHARSET=utf8;

create table like_note(l_user_id mediumint(8), l_note_id mediumint(8), l_date varchar(10), l_view varchar(1)) DEFAULT CHARSET=utf8;

insert into users values
(10, 'serj', 'serj_url', 'img', 1, ''),
(11, 'vlad', 'vlad_url', 'img', 1. ''),
(12, 'dima', 'dima_url', 'img', 1. '');

insert into notes values
(1, 10),
(2, 10),
(3, 11),
(4, 11),
(5, 12);

insert into like_note values
(10, '1', '1373574582', ''),
(10, '2', '1373553582', ''),
(11, '3', '1373574382', ''),
(11, '4', '1378573582', ''),
(12, '5', '1373574592', ''),
(10, '3', '1373574582', ''),
(10, '4', '1373573582', ''),
(12, '2', '1373574582', ''),
(12, '3', '1373573582', ''),
(12, '4', '1373574582', ''),
(11, '1', '1373274582', '');

Отредактированно serj011 (17.08.2015 22:24:03)

Неактивен

 

#12 19.08.2015 06:48:48

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

Re: сортировка в GROUP BY

так?

select like_note.`l_user_id`, t.`l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender` from
(SELECT l_note_id, max(`l_date`) as l_date FROM like_note l GROUP BY 1) t
join `like_note` on t.l_note_id = like_note.l_note_id and t.l_date = like_note.l_date
join `notes` on t.`l_note_id` = `notes`.`id`
join `users` on `like_note`.`l_user_id` = `users`.`id`
WHERE `users`.`time_del_ank` = '' and `users`.`id` != '{$myrow_user['id']}';

Неактивен

 

#13 19.08.2015 18:29:48

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

ОФИГЕТЬ запросик) Спасибо большое за помощь, выдает какие то записи, по моему не то что надо, возможно просто сортировку нужно добавить, которая была в моем варианте изначально, но проверить толком не могу... запрос ужасно "тяжелый", страница виснит((
он действительно такой тяжелый? или не хватает мощности сервера?
like_note - 40000 записей
notes - 3212
users - 5200

Неактивен

 

#14 19.08.2015 18:51:36

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

Re: сортировка в GROUP BY

тяжелый или нет зависит от наличия индексов в таблицах. Ну и limit я забыл, попробуйте

select like_note.`l_user_id`, t.`l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender` from
(SELECT l_note_id, max(`l_date`) as l_date FROM like_note l GROUP BY 1 limit 40) t
join `like_note` on t.l_note_id = like_note.l_note_id and t.l_date = like_note.l_date
join `notes` on t.`l_note_id` = `notes`.`id`
join `users` on `like_note`.`l_user_id` = `users`.`id`
WHERE `users`.`time_del_ank` = '' and `users`.`id` != '{$myrow_user['id']}';

Неактивен

 

#15 19.08.2015 21:03:09

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

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

Неактивен

 

#16 19.08.2015 21:05:42

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

абсолютно смысл запроса другой, у меня вроде нет вот такого например сравнения and t.l_date = like_note.l_date

Неактивен

 

#17 20.08.2015 03:03:07

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

Re: сортировка в GROUP BY

давайте разбираться на примере приведенных выше тестовых данных.
какие строки и почему должны быть выбраны?

Неактивен

 

#18 27.08.2015 19:31:44

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

Мой запрос в целом, даже без подзапросов работает правильно
$resultNote = mysql_query("SELECT
               `like_note`.`l_user_id`, `l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender`
               FROM
               `like_note`,
               `notes`,
               `users`
               WHERE
               `like_note`.`l_note_id` = `notes`.`id`
               and
               `like_note`.`l_user_id` = `users`.`id`
               and
               `users`.`time_del_ank` = ''
               and
               `users`.`id` != '{$myrow_user['id']}'
               GROUP BY `like_note`.`l_note_id`
               ORDER BY `like_note`.`l_date` DESC
               LIMIT 40", $db );

Должны быть выведены данные из таблицы like_note
где `like_note`.`l_note_id` = `notes`.`id` и `like_note`.`l_user_id` = `users`.`id`

выведенные данные ПО ВСЕЙ ТАБЛИЦЕ должны быть сгруппированы GROUP BY `like_note`.`l_note_id`и отсортированы по ORDER BY `like_note`.`l_date`

l_user_id    l_note_id    l_date          l_view
291            4542         1440691164
10125         4542         1440691341
10126         4542         1440691395
10130         4542         1440691476
11501         4542         1440691148
19058         4542         1440588603

Но сгрупированный по l_note_id, например по "4542" из таблицы users должно быть вытащено id, которое по l_date имеет самое большое значение, т.е последняя дата... по всему запросу вытаскивается по l_date правильно, а вот в группе l_user_id вытаскивается что попадется, а нужно тоже максимальное значение

Отредактированно serj011 (27.08.2015 19:34:50)

Неактивен

 

#19 27.08.2015 19:54:37

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

Re: сортировка в GROUP BY

Ну  так приведенный мной запрос это и делает. Смутившее вас сравнение t.l_date = like_note.l_date как раз и обеспечивает l_user_id соответствующий максимальному времени.
На тестовых данных:

MariaDB [test]> select like_note.*
    ->              from
    -> (SELECT l_note_id, max(`l_date`) as l_date FROM like_note l GROUP BY 1 li
mit 40) t
    -> join `like_note` on t.l_note_id = like_note.l_note_id and t.l_date = like
_note.l_date
    -> join `notes` on t.`l_note_id` = `notes`.`id`
    -> join `users` on `like_note`.`l_user_id` = `users`.`id`
    -> WHERE `users`.`time_del_ank` = '' and `users`.`id` != 4;
+-----------+-----------+------------+--------+
| l_user_id | l_note_id | l_date     | l_view |
+-----------+-----------+------------+--------+
|        10 |         1 | 1373574582 |        |
|        11 |         4 | 1378573582 |        |
|        12 |         5 | 1373574592 |        |
|        10 |         3 | 1373574582 |        |
|        12 |         2 | 1373574582 |        |
+-----------+-----------+------------+--------+
5 rows in set (0.00 sec)


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

Неактивен

 

#20 27.08.2015 20:02:37

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

а куда в ваш запрос нужно добавить ORDER BY `like_note`.`l_date` DESC
потому что данные выводятся с самой первой даты в таблице, а нужно наоборот, может в этом дело!?

Неактивен

 

#21 27.08.2015 20:21:06

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

возможно проблема в этом, но куда я уже только не подставлял ORDER BY, ничего не выходит... нужно что бы сортировалось по `like_note`.`l_date` и самая последняя дата выводилась сначала

Неактивен

 

#22 27.08.2015 20:47:57

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

Вообщем чуть переделал, добавил ORDER BY, вроде бы нормально работает, попробую потестировать, а то и сам запутался вообще)))
$resultNote = mysql_query("select like_note.`l_user_id`, t.`l_date`,
               `notes`.*,
               `users`.`nik`, `url`, `avatar`, `gender` from
(SELECT l_note_id, max(`l_date`) as l_date FROM like_note l GROUP BY 1 ORDER BY `l_date` DESC limit 40) t
join `like_note` on t.l_note_id = like_note.l_note_id and t.l_date = like_note.l_date
join `notes` on t.`l_note_id` = `notes`.`id`
join `users` on `like_note`.`l_user_id` = `users`.`id`
WHERE `users`.`time_del_ank` = '' and `users`.`id` != '{$myrow_user['id']}'", $db );

Неактивен

 

#23 27.08.2015 20:56:21

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

Re: сортировка в GROUP BY

ORDER BY нужно добавить в самом конце запроса, а не в подзапросе.

Неактивен

 

#24 27.08.2015 22:09:24

serj011
Активист
Зарегистрирован: 22.04.2010
Сообщений: 234

Re: сортировка в GROUP BY

vasya написал:

ORDER BY нужно добавить в самом конце запроса, а не в подзапросе.

пробывал и там... и одновременно... но правильный вариант вывода данных по дате выводит именно с ORDER BY в подзапросе

Неактивен

 

Board footer

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