Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Упростить запрос.(Оптимизация запроса) / 12 сообщений из 12, страница 1 из 1
26.12.2006, 19:39
    #34226176
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
У меня есть таблицы disks

id name_of_disk
1 britni
2 madonna
3 ......

есть таблица songs
id name_of_song
1 music
2 the born to make you happy
3 Toxic
4 Hoolywood

А еще есть таблица соединяющая лиски с песнями. disk_songs_id
disk_id song_id
1 2
1 3
2 1
2 4
3 ..
3 ..
3 ..

Что бы найти диск мак. коли-ом песен я написал такой запрос

select call_disk
from disks d
join disk_songs_id ds
on ds.disk_id = d.snum
group by call_disk
having count(songs_id) = (select max(t.count) from (select count(songs_id) from disk_songs_id group by disk_id) as t);
ну что то мне подсказывает что можно написать этот запрос на двух Селектах. Как это можно сделать? Требования к запросы , присутствие max , отсутствие limit. Спасибо за ответы.
...
Рейтинг: 0 / 0
27.12.2006, 11:20
    #34227197
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
А почему отсутствие limit ?
Я бы cделал так
Код: plaintext
1.
2.
3.
select call_disk
from disks d
where d.snum = (select disk_id from disk_songs_id group by disk_id order by count(songs_id) desc limit  1 );

На мой взгляд это близко к оптимальному.
А отсутствие limit - бред. В той или иной форме выбрать первые N записей можно в любой базе.
...
Рейтинг: 0 / 0
27.12.2006, 13:40
    #34227817
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
Код: plaintext
1.
2.
3.
select diskid
from disksongsmap
group by diskid having count( 1 ) >= all(select count( 1 ) from disksongsmap group by diskid);
два селекта, нету лимита, правда вот max нету
...
Рейтинг: 0 / 0
27.12.2006, 15:13
    #34228200
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
МНе вот что подсказали , Limit не должно быть , это точно потому , что когда у нас два Макс. запрос работает не корректно.

Подсказка . что-то типа


select name, max(c)
from
(select disc.name as name, count(songs.name) as c
from disc, songs
where disk.id=songs.disc_id and ...
group by name)
where...
group by...

Люди помогите пож-ста , если до 30 не сделаю не привет ДУХ.
...
Рейтинг: 0 / 0
27.12.2006, 15:43
    #34228304
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
JlokiМНе вот что подсказали , Limit не должно быть , это точно потому , что когда у нас два Макс. запрос работает не корректно.
вот так вполне корректно. хотя и с Limit
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT name_of_disk, cnt FROM disks d 
INNER JOIN 
(	SELECT disk_id, count(song_id)  as cnt 
	FROM disk_songs_id t1
	GROUP BY   disk_id
	HAVING
	(count(song_id)) = 
	   (SELECT   
	 (count(song_id)) as cnt FROM  disk_songs_id
	GROUP BY disk_id
	ORDER by cnt DESC LIMIT  1 ) 
) AS m ON disk_id = id;
А если сунете внешний джойн c disks d внутрь селекта, который m - получите 2 селекта. Но без max.

(сами подсчитайте - группировка с подсчетом count - один select, max от него - второй, фильтрация по значению max - третий, ордер же и лимит могут быть сделаны в том же запросе, где и группировка).
...
Рейтинг: 0 / 0
27.12.2006, 17:08
    #34228616
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
вот такое есть
Код: plaintext
1.
2.
3.
4.
5.
6.
select tt.diskid
from
  disksongsmap tt,
  (select count( 1 ) as c, diskid from disksongsmap group by diskid) t
group by tt.diskid
having max(c) = count(case when tt.diskid = t.diskid then  1  else null end);
осталось с именем дисков сджоинить
...
Рейтинг: 0 / 0
27.12.2006, 20:42
    #34229103
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
st_sergвот такое есть
Код: plaintext
1.
2.
3.
4.
5.
6.
select tt.diskid
from
  disksongsmap tt,
  (select count( 1 ) as c, diskid from disksongsmap group by diskid) t
group by tt.diskid
having max(c) = count(case when tt.diskid = t.diskid then  1  else null end);
осталось с именем дисков сджоинить

А как это сделать , на двух селектах , у меня только на трех получается.
...
Рейтинг: 0 / 0
27.12.2006, 22:48
    #34229202
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
Все получилось . Спасибо.
...
Рейтинг: 0 / 0
28.12.2006, 10:31
    #34229686
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
JlokiВсе получилось . Спасибо.
если вам покажут другой вариант, запостите сюда плз, интересно взглянуть )
...
Рейтинг: 0 / 0
28.12.2006, 11:55
    #34230028
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
st_serg JlokiВсе получилось . Спасибо.
если вам покажут другой вариант, запостите сюда плз, интересно взглянуть )
Я твоем варианте добавил join и все.
...
Рейтинг: 0 / 0
28.12.2006, 12:09
    #34230066
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
JlokiЯ твоем варианте добавил join и все.
это-то понятно, но ведь тебе нада запрос преподу показать или кому там... может препод тебе другой вариант покажет, вот его и хотелось бы увидеть.

по поводу слова "оптимизация" в сабже, не всегда то что выглядит красиво, работает быстро. Оптимизация скл запросов, имхо, не сводиться к уменьшению кол-ва select'ов, а сводится к получению приемлемого плана выполнения запроса, используя возможности конкретной субд.
...
Рейтинг: 0 / 0
28.12.2006, 21:19
    #34231564
Jloki
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Упростить запрос.(Оптимизация запроса)
Если покажет , то напишу обязательно .
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Упростить запрос.(Оптимизация запроса) / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]