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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбрать два последних сообщения разных авторов 
V
    Опции темы
nickcore
Дата 25.3.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!
Я новичок в составлении sql-запросов. и у меня не получается сделать следующее.

Дана таблица foo с полями id, автор, сообщение, время:
Код

CREATE TABLE `foo` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `author` varchar(45) NOT NULL,
    `message` text NOT NULL,
    `timestamp` int(11) unsigned NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=MyISAM;

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

Спасибо.

Это сообщение отредактировал(а) skyboy - 25.3.2009, 18:58
PM MAIL   Вверх
nickcore
Дата 25.3.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



такой запрос вроде как подходит
SELECT author, message, timestamp FROM foo
WHERE author !=(SELECT author FROM foo ORDER BY id DESC LIMIT 0,1) OR id=(SELECT id FROM foo ORDER BY id DESC LIMIT 0,1)
ORDER BY id DESC LIMIT 0,2;

Но.... наверняка есть более подходящий способ
PM MAIL   Вверх
Gluttton
Дата 25.3.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

SELECT 
    A.message,
    A.author,
    A.timestamp
FROM foo AS A,
(
    SELECT 
        foo.author,
        MAX(foo.timestamp) AS timestamp
    FROM foo
        GROUP BY foo.author
)   AS S
    WHERE A.author=S.author
    AND A.timestamp=S.timestamp
    AND
    (
        SELECT COUNT(B.timestamp) AS c
        FROM foo AS B,
        (
            SELECT 
                foo.author,
                MAX(foo.timestamp) AS timestamp
            FROM foo
                GROUP BY foo.author
        )   AS S
            WHERE B.id=A.id
            AND B.timestamp>A.timestamp
    )<=2



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


Новичок



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

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



Gluttton, твой запрос не подходит

PM MAIL   Вверх
Gluttton
Дата 25.3.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ошибка? Не верные данные возвращает? Или вообще не подходит?  smile 
СУБД какая?


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


Новичок



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

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



СУБД MySQL. Запрос возвращает 4 записи
PM MAIL   Вверх
Gluttton
Дата 25.3.2009, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Надо же, странно, что он вообще работает  smile .

А один и тот же автор, может создавать несколько сообщений в одно и то же время?


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


Новичок



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

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



Нет. я думаю практически это невозможно
PM MAIL   Вверх
Gluttton
Дата 25.3.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

Нет. я думаю практически это невозможно


Практически то оно может быть и невозможно, а вот БД не воспрещает этого  smile .

Уж больно мне любопытно, почему запрос возвращает 4 записи? Запрос постноен на предположении, что комбинации author и timestamp не повторяються... Вот я испрашиваю... Если не сложно, покажи записи, которые возвращает запрос?


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


Новичок



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

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



пример таблицы
+----+--------+----------------+-----------+
| id | author | message        | timestamp |
+----+--------+----------------+-----------+
| 11 | nick   | nicks message  |         1 | 
| 12 | nick   | nicks message  |         2 | 
| 13 | nick   | nicks message3 |         3 | 
| 14 | jane   | janes message  |         4 | 
| 15 | jane   | janes message2 |         5 | 
| 16 | bob    | bobs message   |         6 | 
| 17 | bob    | bobs message2  |         7 | 
+----+--------+----------------+-----------+
7 rows in set (0.00 sec)


результаты запроса
+----------------+--------+-----------+
| message        | author | timestamp |
+----------------+--------+-----------+
| bobs message2  | bob    |         7 | 
| janes message2 | jane   |         5 | 
| nicks message3 | nick   |         3 | 
+----------------+--------+-----------+
3 rows in set (0.00 sec)


а вообще вот запрос, по моему наиболее простой для данной задачи
Код

SELECT T.* FROM
(SELECT * FROM foo ORDER BY timestamp DESC) AS T
GROUP BY T.author LIMIT 2;



Это сообщение отредактировал(а) nickcore - 26.3.2009, 14:22
PM MAIL   Вверх
Zloxa
Дата 26.3.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(nickcore @  26.3.2009,  14:20 Найти цитируемый пост)
результаты запроса

Это три а не четыре строки
Вместо <=2 напиши <2 потому ка для первой записи будет 0 предшественников, для второй 1 предшественник.
Цитата(nickcore @  26.3.2009,  14:20 Найти цитируемый пост)
вообще вот запрос, по моему наиболее простой для данной задачи


Этот запрос, в отличии варианта, предложенного Gluttton  вернет вам ЛЮБЫЕ message этого автора, не обязательно соответствующие наибольшему timestamp:


Вариант от Gluttton  можно слегка откоректировать (поправьте меня знатоки MySql, если допущу ошибку): 
Код

SELECT 
    A.message,
    A.author,
    A.timestamp
FROM foo AS A,
(
    SELECT 
        foo.author,
        MAX(foo.timestamp) AS timestamp
    FROM foo
        GROUP BY foo.author
    order by 2 desc limit 2
)   AS S
    WHERE A.author=S.author
    AND A.timestamp=S.timestamp
order by a.timestamp desc
limit 2


Это сообщение отредактировал(а) Zloxa - 26.3.2009, 15:13


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Gluttton
Дата 26.3.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



To nickcore

Цитата

Этот запрос, в отличии варианта, предложенного Gluttton  вернет вам ЛЮБЫЕ message этого автора, не обязательно соответствующие наибольшему timestamp:


 smile  ( smile )

To Zloxa

Цитата

Вместо <=2 напиши <2 потому ка для первой записи будет 0 предшественников, для второй 1 предшественник.


 smile 

Цитата

Вариант от Gluttton  можно слегка откоректировать


 smile 


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


Новичок



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

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



Цитата

Этот запрос, в отличии варианта, предложенного Gluttton  вернет вам ЛЮБЫЕ message этого автора, не обязательно соответствующие наибольшему timestamp:

согласен запрос невсегда будет срабатывать. smile 

но все же вот как мне кажется более простой запрос

Код

SELECT f.*
FROM foo AS f
JOIN (SELECT MAX(id) AS id FROM foo GROUP BY author) AS t USING (id)
ORDER BY f.id DESC
LIMIT 2;


Спасибо огромное за помощь. буду дальше в скул врубаться.....


PM MAIL   Вверх
Бонифаций
Дата 28.3.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему вы хотите все это выбрать именно 1 запросом? Двумя то проще. И почти наверняка быстрее (проще план выполнения). Что то типа

Код

 select id, @A:=author, @T:=`timestamp` from foo order by `timestamp` desc limit 1;
 select * from foo where timestamp <> @T and author <> @AU  order by `timestamp` desc limit 1;



--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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