Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySQL] кривой запрос group by order by 
V
    Опции темы
gcc
Дата 8.3.2010, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



есть таблица 

Код
table1_users

id, username, blog_name


Код
-----
table2_blog

id_bl,  id_un, name, created


мне нужно вывести все последние записи с table2_blog с конретного пользователя блога, понятно?

т.е. прост овыести последние записи и чтобы поледние записи ыли уникальные по пользователю... как это сделать


такой запрос работает, но выводит только наоборот с начала, только первые уникальные записи (group by группирует только с начала , а не нужно конечное)


Код
SELECT t1.id_bl,
                                          t1.id_un,
                                          t1.name,
                                         t1.created,
                                          t1.view,
                            
                                      t2.username,
                                         t2.blog_look,
                                         t2.blog_forb_rw_g_cm, 
                                          t2.blog_name,
                                          t2.blog_count,     
                              
                               FROM blog AS t1

                          
                                   INNER JOIN users AS t2
                                   ON t1.id_un = t2.id                                                                 
                                
                           WHERE t2.blog_look = 0  

                          group by t1.id_un

                          ORDER BY t1.created desc

                           LIMIT ?,?


Это сообщение отредактировал(а) gcc - 8.3.2010, 05:52
PM WWW ICQ Skype GTalk Jabber   Вверх
Gluttton
Дата 8.3.2010, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



Цитата(gcc @  8.3.2010,  05:52 Найти цитируемый пост)
мне нужно вывести все последние записи с table2_blog с конретного пользователя блога, понятно?

Ну если я правильно понимаю, то нужно вывести для каждого пользователя из таблицы table1_users запись с максимальным значением из таблицы table2_blog...
Если да, то это будет примерно так:
Код

select
    t1.id, 
    t1.username, 
    max(t2.created) as created
from table1_users as t1
    inner join table2_blog as t2
    on t1.id=t2.ui_id
        group by t1.id, t1.username 


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


--------------------
Слава Україні!
PM MAIL   Вверх
Deniz
Дата 9.3.2010, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Может как-то так:
Код
select t1.*, t2.*
from users t1
  join blog t2 on t2.id_un = t1.id
where (t2.created = (select max(created) from blog where id_un = t1.id)
order by ...



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
gcc
Дата 9.3.2010, 10:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



мне подсказали еще так (не знал что так можно)

сочинил так:
Код
SELECT * FROM (
SELECT t1.id_bl, t1.id_un, t1.name, t1.created, t1.view,
t2.username, t2.blog_look, t2.blog_forb_rw_g_cm, t2.blog_name, t2.blog_count
FROM blog AS t1
INNER JOIN users AS t2 ON t1.id_un = t2.id
WHERE t2.blog_look = 1
ORDER BY t1.created desc
) `a`
GROUP BY id_un
ORDER BY created desc
LIMIT ?,? 



Это сообщение отредактировал(а) gcc - 9.3.2010, 11:19
PM WWW ICQ Skype GTalk Jabber   Вверх
tusha
Дата 9.3.2010, 15:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: 1
Всего: 1



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

select
    t1.id_un, t2.name
    max(t2.created) as created
from table2_blog t1
left join users AS t2 ON t1.id_un = t2.id
        group id_un, name

 smile 
PM MAIL   Вверх
gcc
Дата 10.3.2010, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



tusha,  вариант уважаемого  Gluttton выдает первую запись так как в первом посте (самую старую), а нужно последнюю, самую новую...
я пробовал его изменять, идея того варианта все время выдает самую старую запись... возможно из-за того что мне не хватило знаний его переделать...

а в чем разница в том запросе который я привел? оно же просто перегрупирует нормально?

Это сообщение отредактировал(а) gcc - 10.3.2010, 04:23
PM WWW ICQ Skype GTalk Jabber   Вверх
tusha
Дата 10.3.2010, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: 1
Всего: 1



т.е. нужно  первую запись в последнем посте?

Это сообщение отредактировал(а) tusha - 10.3.2010, 08:42
PM MAIL   Вверх
Gluttton
Дата 10.3.2010, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 24
Всего: 54



gcc, предлагаю перейти к решению задачи на тестовом наборе данных...


--------------------
Слава Україні!
PM MAIL   Вверх
gcc
Дата 10.3.2010, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



а в чем разница в том запросе который я привел? оно же просто перегрупирует нормально?

Добавлено @ 09:08
Цитата(tusha @ 10.3.2010,  08:41)
т.е. нужно  первую запись в последнем посте?

да, первую запись(последнюю) в каждом блоге....

блог пользвоателя, он один user_table   
id - первычный (id пользователя)
username - имя пользвоателя
pwd 
blog_name блог


тут записи блога blog_table   
id_bl - первычный (на всякий случай, сделал именно так)
id_un  (id пользователя)
name название записи

связывается  id_un = id

все



Это сообщение отредактировал(а) gcc - 10.3.2010, 09:11
PM WWW ICQ Skype GTalk Jabber   Вверх
tusha
Дата 10.3.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: 1
Всего: 1



Цитата

первую запись(последнюю) в каждом блоге....

дак первую или последнюю?  smile 

сделаем для самой ранней записи в каждом блоге (т.е. с минимальной датой)
хм, к тому же тогда надо id блога + id записи - 
вот такое чтото для первой записи последнего блога:
Код

select
    t1.id_un, t2.name, 

    t1.blog_id // выбираем еще айди блога

    min(t1.created) as created // минимальную дату
from table2_blog t1
left join users AS t2 ON t1.id_un = t2.id
where t1.blog_id=(select max(blog_id) from table2_blog where table2_blog.id_un=t1.id_un) // ищем последний блог по данному юзеру
        group id_un, name,
        t1.blog_id // и по нему же группируем


можеш привести полные структуры таблиц с кратким описанием , а то так сложно угадать?

если надо первая запись для каждого блога:
Код

select
    t1.id_un, t2.name, 

    t1.blog_id // выбираем еще айди блога

    min(t1.created) as created // минимальную дату
from table2_blog t1
left join users AS t2 ON t1.id_un = t2.id
        group id_un, name,
        t1.blog_id // и по нему же группируем



Это сообщение отредактировал(а) tusha - 10.3.2010, 10:37
PM MAIL   Вверх
solenko
Дата 10.3.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 4
Всего: 67



Еще раз. Нужно получить ОДНУ последнюю запись из blog_table для каждого пользователя? Результат должен содержать поля из user_table?
Прооще говоря: перечислите все поля, которые должны войти в результат + недурно было бы оформлять к вопросу тестовый набор чтобы это не приходилось делать кажддому, кто пытается ответить.

Код

DROP TABLE IF EXISTS user_table;
CREATE TABLE user_table (
  id         INT NOT NULL auto_increment PRIMARY KEY,
  username   VARCHAR(255),
  blog_name  VARCHAR(255)
);

INSERT INTO user_table VALUES (NULL, 'user 1', 'user 1 blog');
INSERT INTO user_table VALUES (NULL, 'user 2', 'user 2 blog');
INSERT INTO user_table VALUES (NULL, 'user 3', 'user 3 blog');

DROP TABLE IF EXISTS blog_table;
CREATE TABLE blog_table (
  id_bl     INT NOT NULL auto_increment PRIMARY KEY,
  id_un     INT NOT NULL references user_table(id),
  name      VARCHAR(255),
  created   DATETIME
);


INSERT INTO blog_table VALUES (NULL, 1, 'Post #1 from user 1', '2010-01-01');
INSERT INTO blog_table VALUES (NULL, 2, 'Post #1 from user 2', '2010-01-08');
INSERT INTO blog_table VALUES (NULL, 3, 'Post #1 from user 3', '2010-01-03');


INSERT INTO blog_table VALUES (NULL, 1, 'Post #2 from user 1', '2010-01-02');
INSERT INTO blog_table VALUES (NULL, 2, 'Post #2 from user 2', '2010-01-10');
INSERT INTO blog_table VALUES (NULL, 3, 'Post #2 from user 3', '2010-01-07');


INSERT INTO blog_table VALUES (NULL, 1, 'Post #3 from user 1', '2010-01-03');
INSERT INTO blog_table VALUES (NULL, 2, 'Post #3 from user 2', '2010-01-15');
INSERT INTO blog_table VALUES (NULL, 3, 'Post #3 from user 3', '2010-01-17');



Какой result-set вы ждете на выходе?

Это сообщение отредактировал(а) solenko - 10.3.2010, 10:53


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 10.3.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 4
Всего: 67



Ну и на правах телепата:
Код

SELECT u.*, LEFT(MAX(CONCAT(b.created, LPAD(b.id_bl, 10, ' '), b.name)), 19) as post_date,
  TRIM(SUBSTR(MAX(CONCAT(b.created, LPAD(b.id_bl, 10, ' '), b.name)), 20, 10)) as post_id,
  SUBSTR(MAX(CONCAT(b.created, LPAD(b.id_bl, 10, ' '), b.name)), 30) as post_name
FROM user_table u INNER JOIN blog_table b ON u.id = b.id_un
GROUP BY u.id

-- как показывает практика, такой метод работает быстрее вложенных запросов.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Deniz
Дата 10.3.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



gcc, а чем мой запрос не устраивает?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.