Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, вот почитал по этой теме - 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 сортировался в обратном порядке...
Неактивен
Не очень понятно, что значит «чтобы GROUP BY сортировался в обратном порядке?» Оно сортируется по l_date. Если Вам нужно еще сортировать по группировке, то нужно явно об этом написать. Как-нибудь так:
ORDER BY l_note_id, l_date DESC
Тогда записи будут выдаваться в порядке группировки (а внутри уже по дате), ну и можно добавить слово DESC, если нужен другой порядок.
Неактивен
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
Неактивен
вы правильно указали нужную вам ссылку
сначала нужно получить пару 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`...
возможно подзапрос можно упростить, это зависит от ваших данных.
Неактивен
Все таки мыслю я в правильном направлении)))
vasya, если вас не затруднит, то помоги пожалуйста переделать мой запрос на такой, так как я такой сложный запрос с JOIN не осилю)
Неактивен
Неактивен
vasya, спасибо за помощь, но неверное где то есть ошибка, т.к. запрос ничего не вытаскивает
опечатки в названиях полей вроде нет, наверное ошибка в логике запроса, посмотрите пожалуйста
Неактивен
приведите набор тестовых данных в виде
create table
insert into
чтобы можно было проверить
Неактивен
извините за глупый вопрос, но это как?
Неактивен
набор команд на создание таблиц и заполнение их тестовыми данными, чтобы можно было воспроизвести у себя.
пример http://sqlinfo.ru/forum/viewtopic.php?pid=40086#p40086
Неактивен
Отредактированно serj011 (17.08.2015 22:24:03)
Неактивен
так?
Неактивен
ОФИГЕТЬ запросик) Спасибо большое за помощь, выдает какие то записи, по моему не то что надо, возможно просто сортировку нужно добавить, которая была в моем варианте изначально, но проверить толком не могу... запрос ужасно "тяжелый", страница виснит((
он действительно такой тяжелый? или не хватает мощности сервера?
like_note - 40000 записей
notes - 3212
users - 5200
Неактивен
тяжелый или нет зависит от наличия индексов в таблицах. Ну и limit я забыл, попробуйте
Неактивен
вот я протупил, тормоза были именно из за отсутствия лимита, сейчас работает...
а вот логика запроса вытаскивает совершенно другое чем мой вариант, пока не могу понять
Неактивен
абсолютно смысл запроса другой, у меня вроде нет вот такого например сравнения and t.l_date = like_note.l_date
Неактивен
давайте разбираться на примере приведенных выше тестовых данных.
какие строки и почему должны быть выбраны?
Неактивен
Мой запрос в целом, даже без подзапросов работает правильно
$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)
Неактивен
Ну так приведенный мной запрос это и делает. Смутившее вас сравнение t.l_date = like_note.l_date как раз и обеспечивает l_user_id соответствующий максимальному времени.
На тестовых данных:
Неактивен
а куда в ваш запрос нужно добавить ORDER BY `like_note`.`l_date` DESC
потому что данные выводятся с самой первой даты в таблице, а нужно наоборот, может в этом дело!?
Неактивен
возможно проблема в этом, но куда я уже только не подставлял ORDER BY, ничего не выходит... нужно что бы сортировалось по `like_note`.`l_date` и самая последняя дата выводилась сначала
Неактивен
Вообщем чуть переделал, добавил 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 );
Неактивен
ORDER BY нужно добавить в самом конце запроса, а не в подзапросе.
Неактивен
vasya написал:
ORDER BY нужно добавить в самом конце запроса, а не в подзапросе.
пробывал и там... и одновременно... но правильный вариант вывода данных по дате выводит именно с ORDER BY в подзапросе
Неактивен