![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запрос с max() [D5, D6]
SergP © (2004-03-29 22:53:00)Видно туплю я сегодня... Не могу написать запрос. Подскажите....
Допустим (здесь я упрощаю задачу так чтобы осталось только то что у меня не получается)
Имеется 2 таблицы:
У одной (a)поля:
id (уникальные значения), field1 (любое другое поле).
У второй (b):
id (соотвествует id первой таблицы, но записей с одним id может быть много), field2 (целое число).
Нужно выбрать из обоих таблиц записи с полями поля id (должно быть с уникальным значением), field1, field2 (из всех записей таблицы b с одинаковым id нужно выбрать те у которых field2 максимальное) чтобы where a.id=b.id
БД access & MySQL
SergP (2004-04-02 22:59:00) [1]написал так:
select a.topic_id,a.forum_id,a.topic_poster,max(b.post_time) as mtime,a.topic_title
from $t_topics as a, $t_posts as b
where a.topic_id=b.topic_id
group by a.topic_id
HAVING mtime>=$ltime and mtime<=$rtime
order by mtime
limit 50
Все работает. Большое спасибо...
наверное меня спасло то, что
>Zacho © (02.04.04 22:31)
>Я сейчас не совсем трезв
Люди в таких ситуациях иногда очень правильно мыслят... :)))
Zacho (2004-04-02 22:31:00) [2]Я сейчас не совсем трезв :), но может тебя спасет
HAVING max(b.post_time)>=$ltime and max(b.post_time)<=$rtime ?
SergP (2004-04-02 22:09:00) [3]Можно было бы обойтись вложенным запросом, но MySQL их не поддерживает. :(((
SergP (2004-04-02 22:04:00) [4]Хм.... order by 3 работает.
А вот:
where a.topic_id=b.topic_id and mtime>=$ltime and mtime<=$rtime
ти так не хочет работать, ни так:
where a.topic_id=b.topic_id and max(b.post_time)>=$ltime and max(b.post_time)<=$rtime
Что делать?
SergP (2004-03-30 13:06:00) [5]Ок. попробую вечером. А то щас у меня нет возможности добраться до ftp от хостинга...
Но хочу спросить:
Johnmen, Вы обращали мое внимание на order by mtimelimit 50,
а как быть с where a.topic_id=b.topic_id and mtime>=$ltime and mtime<=$rtime
будет ли это работать, ведь я здесь тоже использую алиас поля
Johnmen (2004-03-30 10:02:00) [6]Потому, что так задумано и спроектировано в рамках стандарта SQL. И предназначение алиасов полей другое.
Попробуйorder by 3
SergP (2004-03-30 09:52:00) [7]Но ведь я делаю:
select ... max(b.post_time) as mtime, ...
Почему тогда нельзя сделать:
where a.topic_id=b.topic_id and mtime>=$ltime and mtime<=$rtime
order by mtimelimit 50
И как можно поступить в данной ситуации?
Johnmen (2004-03-30 09:35:00) [8]Вот это
order by mtimelimit 50
SergP (2004-03-30 09:30:00) [9]На этот раз попробовал изменить запрос в серверной части проги (PHP+MySQL)
select a.topic_id,a.forum_id,a.topic_poster,max(b.post_time) as mtime,a.topic_title
from $t_topics as a, $t_posts as b
where a.topic_id=b.topic_id and mtime>=$ltime and mtime<=$rtime
group by a.topic_id,a.forum_id,a.topic_poster,a.topic_title
order by mtime limit 50
Не работает зараза... Что здесь неправильно?
SergP (2004-03-29 23:10:00) [10]так...
Вот черт... Понял... Я про group by a.id, a.fld1
забыл... Просто в реальности у меня там много полей аналогичных a.fld1, вот и забыл что по ним тоже нужно групировать. Возможно еще и потому об этом не подумал, что id в первой таблице имеет уникальные значения (и к тому же оно - ключевое поле), и поэтому как-то подсознательно надеялся можно опустить a.fld1...
Sergey Masloff (2004-03-29 23:02:00) [11]select a.id, a.fld1, max(b.fld2)
from tbl1 a, tbl2 b
where a.id=b.id
group by a.id, a.fld1
так?