mysql выборка

Dreammaker
На сайте с 20.04.2006
Offline
569
#11
Miracle:
но я так и не понял как это может помочь?!

я в первый пост не вчитывался, просто вы написали

Miracle:
в двух словах можно, лично я никогда особой разницы не видел.

разница есть ведь :)

M
На сайте с 20.08.2004
Offline
376
#12
отец сыночка, лапочки дочки и еще одного сыночка
[Удален]
#13

Miracle, 404

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

проверьте пзз еще раз

Miracle добавил 04.10.2009 в 17:03

самый первый должен быть юзер 3 к блогу 47

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

[Удален]
#15
netwind:
Я заметил, что некоторые использую слово LEFT везде - /ru/forum/403218

У меня это был единственный LEFT из всего запроса. В отсальной части везде были INNER JOIN

Так?

SELECT tc.comment_id, t.talk_id, talk_topic, u.user_email, u.user_nickname
FROM bt_talk_comment tc
INNER JOIN bt_talk t ON t.talk_id = tc.talk_id
INNER JOIN bt_user u ON u.user_id = tc.user_id
WHERE tc.comment_activity =1
GROUP BY t.talk_id
ORDER BY tc.comment_timestamp DESC
LIMIT 5
M
На сайте с 20.08.2004
Offline
376
#16
So1:
Так?

Так это у меня вопрос был?

Да даже по логике выводы не должны отличатья от inner и left :). Дело не в этом.

Но ради интереса попробовал но как и сказал - не оно.

N
На сайте с 06.05.2007
Offline
419
#17

Кажется, спутали условие join , попробуйте так :

SELECT tc.comment_id, t.talk_id, talk_topic, u.user_email, u.user_nickname

FROM bt_talk_comment tc
JOIN bt_talk t ON t.talk_id = tc.talk_id
JOIN bt_user u ON u.user_id = t.user_id
WHERE tc.comment_activity=1
GROUP BY t.talk_id
ORDER BY tc.comment_id DESC
LIMIT 5

Если написать перед запросом EXPLAIN, то можно увидеть как отличается метод обработки с LEFT и без. Вот если бы вы в поля прописали бы NOT NULL, то наверное, план выполнения не отличался бы.

Кнопка вызова админа ()
M
На сайте с 20.08.2004
Offline
376
#18
JOIN bt_user u ON u.user_id = t.user_id

так было бы если бы я выбирал автора темы, а мне нужен автор комментария :)

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



Выводит правильно все, кроме авторов, те в данном случае выводит в порядке убывания темы блога (те как надо) но вот автора подписывает первого кто написал коммент к блогу

Как побороть такое ?

Спасибо.

Miracle,

Запрос под задачу вообще не верный. Если Вам нужно Х последних комментариев, то нужно делать group by tc.comment_id.

Или вообще забить на group by если на один коммент у Вас только 1 блог и 1 юзер.

Если Вы делаете group by talk_id, то Вы группируете выборку по блогам, и значения коммент_ид и автора в этой группе будут случайными. А сортировка включается не внутри группы, а уже по тем членам, которые были выбраны из группы случайно.

То есть объясним на примере допустим

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

Если у Вас задача выбрать по Х последних комментариев из каждого блога, то читайте эту тему /ru/forum/comment/5029477+join#post5029477 .

netwind, не первый раз замечанем за Вами странные, но неверные (и как правило религиозного плана) утверждения. left join в таких случаях не хуже inner join, и зачастую его использовать как раз более разумно, хотя хватило бы и иннера. Плюс комменты от "анонимов" (не обязательно НЛО) не такая уж редкая вещь и для них (сюрприз) записи в таблице юзеров может и н еоказаться.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
N
На сайте с 06.05.2007
Offline
419
#20

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

SELECT tc.comment_id, t.talk_id, talk_topic, u.user_email, u.user_nickname
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 tc.comment_id DESC
LIMIT 5
) last_tc
ON tc.comment_id=last_tc.g_max_tc_id
JOIN bt_talk t ON tc.talk_id = t.talk_id
JOIN bt_user u ON tc.user_id = u.user_id;

кстати, в дампе натуральное НЛО - user_id =3 отсутствует.

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