[MySQL] сложный запрос, оптимизация

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

[MySQL] сложный запрос, оптимизация

Непрочитанное сообщение ProFTP » 2010-04-25 18:16:41

я хотел вывести 2 фотографии с последних фотоальбомов... с последних 5 фотоальбомов (или 10-20)
нужно проверить доступность фотоальбома и доступность фотографии
(я хотел вывести первую фотографии в фотоальбоме и последнюю фотографию в нем же, всего 2 вывести)


у меня не получается проверить, если я ставлю id_pf_min в where он пишет что не извесный id_pf_min вообще!!

вообщем, как пропутить тот фотоальбом в котором нету фотографии и в котором id_pf_min не равняется

я сделал через INNER JOIN ( в него вставил через ON IN вложенный запрос), но вроде бы плохо, для видео выполняется сек. 10

Код: Выделить всё

SELECT t1.privat_pa,
                                               t1.id_pa,  
                                               t1.name_pa,          

                    (SELECT MIN(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa '.$sql_p.' ) AS id_pf_min,                                        
                      (SELECT MAX(t5.id_pf) FROM photo_files AS t5 WHERE t5.id_pa = t1.id_pa AND t5.id_pf > id_pf_min '.$sql_p2.' ) AS id_pf_max                                        

                         FROM photo_albums AS t1

                            INNER JOIN photo_files AS t77
                                  ON t77.id_pf in (SELECT MIN(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa '.$sql_p.' )

                                     
                                  
                                    LEFT JOIN content AS t2
                                  ON t1.id_co = t2.id_co                                  
                                 ' . $sql2 . '
                        ' . $sql . '
                        AND id_pf is not null
                   ORDER BY t1.created desc 
                      LIMIT 5 
================


а вот есть для видео тоже самое:
(только есть таблица video_files_preview еще одна, треья, с превиюшками )

можно ли это оптимизировать? опять таки кажется что на PgSQL такое по проще и по легче?
повторюсь, в where не работает если вставить алиас id_vf_min

Код: Выделить всё

SELECT  
                                               t1.id_va,    
                                               t1.privat_va,      
                                           t1.name_va ,
                                           
                                              ( SELECT MIN(t20.id_vf) FROM  video_files AS t20
                                                  WHERE t20.id_va = t1.id_va ) AS id_vf_min,                                           
                                           
                                              (
                                            SELECT MIN(t10.id_vfp)                 
                                                    FROM video_files_preview AS t10
                                               WHERE t10.id_vf = id_vf_min

                                              )    AS vf_preview_min,
                                              
                                              
                                              
                                              
                                              ( SELECT MAX(t21.id_vf) FROM  video_files AS t21
                                                  WHERE t21.id_va = t1.id_va ) AS id_vf_max,                                           
                                           
                                              (
                                            SELECT MAX(t11.id_vfp)                 
                                                    FROM video_files_preview AS t11
                                               WHERE t11.id_vf = id_vf_max

                                              )    AS vf_preview_max                                              
                                              

                                           
                                           
                         FROM video_albums AS t1

                        INNER JOIN video_files_preview AS t77
                           ON t77.id_vfp in (
                                            SELECT MIN(t10.id_vfp)                 
                                                    FROM video_files_preview AS t10
                                               WHERE t10.id_vf in ( SELECT MIN(t20.id_vf) FROM  video_files AS t20
                                                  WHERE t20.id_va = t1.id_va ) 
                                              )
                       

                                    LEFT JOIN content AS t2
                                  ON t1.id_co = t2.id_co                                  
                             
                   ORDER BY t1.created desc 
                      LIMIT 5
Your MySQL connection id is 41076
Server version: 5.0.83-log FreeBSD port: mysql-server-5.0.83


кстате, в последнее время хитрые запросы на MySQL пишутся архисложно, на PgSQL подобное давным давно доступно для использование...
может использовать исключительно PgSQL?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [MySQL] сложный запрос, оптимизация

Непрочитанное сообщение ProFTP » 2010-04-27 1:05:10

сделал так:
добавил вложенній в FROM

Код: Выделить всё

SELECT t1.privat_pa,  
                                               t1.id_pa,    
                                               t1.name_pa,            
 
                    id_pf_min,                                          
                      (SELECT MAX(t5.id_pf) FROM photo_files AS t5 WHERE t5.id_pa = t1.id_pa AND t5.id_pf > id_pf_min '.$sql_p2.' ) AS id_pf_max        
FROM photo_albums t1, (SELECT MIN(t6.id_pf) FROM photo_files AS t6 WHERE t6.id_pa = t1.id_pa '.$sql_p.' ) id_pf_min
LEFT JOIN  
и в INNER JOIN вложенный

Код: Выделить всё

'SELECT  
 		  	    							t1.id_va,    
 		  	    							t1.privat_va,      
   										t1.name_va ,
   										
  											( SELECT MIN(t20.id_vf) FROM  video_files AS t20
  											    WHERE t20.id_va = t1.id_va '.$sql_p.' ) AS id_vf_min,   										
   										
  											(
											SELECT MIN(t10.id_vfp)    			 
        						 				   FROM video_files_preview AS t10
        					   				WHERE t10.id_vf = id_vf_min

  											)	AS vf_preview_min,
  											
  											
  											
  											
  											( SELECT MAX(t21.id_vf) FROM  video_files AS t21
  											    WHERE t21.id_va = t1.id_va AND t21.id_vf > id_vf_min '.$sql_p2.') AS id_vf_max,   										
   										
  											(
											SELECT MAX(t11.id_vfp)    			 
        						 				   FROM video_files_preview AS t11
        					   				WHERE t11.id_vf = id_vf_max

  											)	AS vf_preview_max  											
  											

   										
   										
	 					FROM video_albums AS t1

				INNER JOIN video_files AS t78
        		 		  ON t78.id_vf in  ( SELECT MIN(t20.id_vf) FROM  video_files AS t20
  											    WHERE t20.id_va = t1.id_va '.$sql_p.' ) 

 					   INNER JOIN video_files_preview AS t77
        		 		  ON t77.id_vfp in (
											SELECT MIN(t10.id_vfp)    			 
        						 				   FROM video_files_preview AS t10
        					   				WHERE t10.id_vf = t78.id_vf
  											)
    		 		  

									LEFT JOIN content AS t2
               		 		  ON t1.id_co = t2.id_co               		 		  

 				   ' . $sql2 . '
	 				   ' . $sql . '	 	 			
	 	 				   
	 			  ORDER BY t1.created desc 
	 			     LIMIT 5
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение