mysql выборка

1 2345 6
M
На сайте с 20.08.2004
Offline
376
#21

С юзером 3 вышла опечатка, Там должен быть юзер 3, я специально почистил базу что бы не выкладывать все 30000 юзеров. НЛО быть не может, юезра не удаляются, на крайняк отключаются.

За запрос спасибо, пока для меня темный лес, я бы не догадался, но , если судить по дампу, должны быть выведены talk_id по такой очередности 47 , 44, 42, 45, 39 в вашем же запросе 47 ,42, 45, 39, 44 - почему так хитро мне не понятно.

Miracle добавил 05.10.2009 в 01:36

edogs:
Если Вам нужно Х последних комментариев, то нужно делать group by tc.comment_id.

если мне нужно Х последних комментариев то group by делать вообще не надо, а уж тем более не понимаю смысла group by tc.comment_id - это однозначно не имеет смысла :-) в любом случае.

edogs:
Если Вы делаете group by talk_id, то Вы группируете выборку по блогам, и значения коммент_ид и автора в этой группе будут случайными. А сортировка включается не внутри группы, а уже по тем членам, которые были выбраны из группы случайно.
я тоже так думал, потому я не зная как это делать раньше просто выбирал раз в несколько больше данных и на уровне пхп сам их парсил как надо, те выводил последние.
edogs:
блогид комментид: 1 10, 1 5, 1 15.... 2 2, 2 12, 2 22. Ваша выборка даст кол-во строк столько, сколько есть блогов. Сначала мускул сгруппирует выборку по ИД блога, а в комментид попадет случайный представитель из группы (т.е. может попасть как 10 так и 15 так и 5 к блогид=1... и так же к блогид=2), а вот потом уже включится сортировка. Более того, если в коммент_ид у Вас выберется 10, то не факт что текст коммента в этой группе тоже будет относится к 10 комменту - он опять же будет случайным.

вот это вообще пока запутано для меня, на практике данные привязаны и пока я не понимаю как в поле с коммент_айди одним может быть текст из другого, да и в скрипте такого не наблюдается

Miracle добавил 05.10.2009 в 01:38

ребята, большое спасибо за то что помогаете.

а то надоело делать через попу :), хотя не факт что скрипт выше намного проще разбора всего этого на пхп :)

отец сыночка, лапочки дочки и еще одного сыночка
edogs software
На сайте с 15.12.2005
Offline
775
#22
Miracle:
если мне нужно Х последних комментариев то group by делать вообще не надо

Ну как сформулировали:)

Miracle:
я не понимаю как в поле с коммент_айди одним может быть текст из другого

В Вашем первом запросе - легко. Попробуем проще объяснить выборку.

Действует группировка по talk_id. Соответственно в одной группе talk_id у Вас окажется допустим 20 разных comment_id и text_comment. И при выборке Вам мускул отдаст случайного представителя этих полей для каждой группы.

Miracle:
Miracle добавил 05.10.2009 в 01:38
ребята, большое спасибо за то что помогаете.
а то надоело делать через попу :), хотя не факт что скрипт выше намного проще разбора всего этого на пхп :)

Если Вам нужно по Х записей последних из каждого блога, то самый оптимальный вариант следующий - не извращаться с запросами. А сделать нечто вроде "кэширования". При постинге записи в блог, апдейтить таблицу с комментами. Выставляя 5 последним флажок "один из последних комментариев" (естественно с ограничением по полю соответствующего апдейтенного блога). Постинг вещь редкая - нагрузки особой не будет. Зато выборка будет простой как колумбово яйцо, просто по флагу.

пысы: и посмотрите все-таки /ru/forum/comment/5029477+join#post5029477 тут пример:) он может быть и не подойдет Вам 1 в 1, но именно в разрезе "х последних откуда-то" дает хорошую пищу для размышлений.

netwind, от человека только что ругавшего кого-то за использование лефт.джоина - нам удивительно видеть от Вас вложенные запросы:)

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
N
На сайте с 06.05.2007
Offline
419
#23
Miracle:
За запрос спасибо, пока для меня темный лес, я бы не догадался, но , если судить по дампу, должны быть выведены talk_id по такой очередности 47 , 44, 42, 45, 39 в вашем же запросе 47 ,42, 45, 39, 44 - почему так хитро мне не понятно.

а это я сортировку просмотрел. правильно так :


select tc.comment_id,tc.*
from
bt_talk_comment tc
JOIN
(
select max(tc.comment_id) g_max_tc_id
from bt_talk_comment tc
WHERE tc.comment_activity=1
GROUP BY tc.talk_id
ORDER BY g_max_tc_id DESC
LIMIT 5
) last_tc ON tc.comment_id=last_tc.g_max_tc_id
JOIN bt_talk t ON t.talk_id = tc.talk_id
LEFT JOIN bt_user u ON u.user_id = tc.user_id;

я, правда, опасаюсь за подзапрос. что-то он на этих данных вырождается в полный перебор.

Кнопка вызова админа ()
[Удален]
#24

netwind, солидарен с вашим запросом, но чуток упростим)

SELECT tc.comment_id, t.talk_id, talk_topic, u.user_email, u.user_nickname
FROM
(
SELECT distinct talk_id, comment_id, user_id
FROM bt_talk_comment
WHERE comment_activity=1
order by comment_id DESC
LIMIT 5
) tc
LEFT JOIN bt_user u ON u.user_id = tc.user_id
LEFT JOIN bt_talk t ON t.talk_id = tc.talk_id
group by t.talk_id
order by comment_id desc

думаю что можно еще упростить ...

bearman добавил 05.10.2009 в 09:41

netwind, с подзапросом все нормально.

1 PRIMARY <derived2> ALL 5 Using temporary; Using filesort
1 PRIMARY u eq_ref PRIMARY PRIMARY 4 tc.user_id 1
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 tc.talk_id 1
2 DERIVED bt_talk_comment index PRIMARY 4 39 Using where
[Удален]
#25

netwind, с подзапросом все нормально.

1 PRIMARY <derived2> ALL 5 Using temporary; Using filesort
1 PRIMARY u eq_ref PRIMARY PRIMARY 4 tc.user_id 1
1 PRIMARY t eq_ref PRIMARY PRIMARY 4 tc.talk_id 1
2 DERIVED bt_talk_comment index PRIMARY 4 39 Using where
N
На сайте с 06.05.2007
Offline
419
#26

bearman, может быть внешний group by t.talk_id не обязателен. А то на дампе получается 3 записи всего.

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

и еще на моей версии mysql подзапрос упорно игнорирует индекс. а у вас - планирует перебрать по индексу 39 записей.

[Удален]
#27

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

M
На сайте с 20.08.2004
Offline
376
#28

Ребята всем спасибо. Отблагодарил всех кто более ли менее помог, некоторым не смог поставить, видимо недавно уже за что-то благодарил - тогда просто спасибо.

Пересматриваю свои знания по маэскуэль в свете новых полученных.

M
На сайте с 20.08.2004
Offline
376
#29

немного другой вопрос, но задам здесь

EXPLAIN SELECT u . * , s . *
FROM forum_sessions s, forum_users u
WHERE s.session_id = '8d699e58183e97f2d06cb16dc9f6af93'
AND u.user_id = s.session_user_id
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE s const PRIMARY,session_user_id,session_id_ip_user_id PRIMARY 32 const 1
1 SIMPLE u const PRIMARY PRIMARY 3 const 1

запрос выполняется 14 секунд

загрузка процессора от маэскуэля до 50%

с чем может быть такое связано?

юзеров 11526

сессий 2141

спасибо.

N
На сайте с 16.02.2009
Offline
19
#30

Используйте JOIN при соединении таблиц :)

1 2345 6

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий