phpbar.de logo

Mailinglisten-Archive

SQL abfrage zwischen drinn?

SQL abfrage zwischen drinn?

Jan Kuehl jan.kuehl at software-tomography.com
Mit Mai 26 18:23:16 CEST 2004


Hi Sebastian, Hi Michael

Die untere Anfrage an sich ist vom Ansatz richtig, falls LIMIT im 
UNION-Part funktioniert, hat aber ein paar Nachteile. So gehst Sebastian 
implizit davon aus, dass LIMIT 5 die Reihenfolge des PRIMARY KEYs bzw. 
hier sogar des nicht PRIMARY KEY 'date' beruechsichtigt. Dem muss aber 
nicht so sein, wobei man dies mit ORDER BY schon hinbekommen kann. Das 
andere Problem liegt im UNION selbst, welcher nur in einer aeusseren 
Abfrage vorkommen kann, d.h. die Anfrage selbst kann nicht wieder direkt 
als nested-Anfrage benutzt werden, was in Hinblick auf den kommenden 4.1 
bei der Entwicklung schon mit beruecksichtigt werden sollte. 
Andererseits ist bei deiner Anfrage schon anzumerken, dass sie um 
einiges performanter sein duerfte als die meinige, da die 
Duplikateleminierung im UNION bei nur max 11 Ergebnissen 
vernachlaessigbar ist und du keine nested-Anfragen mit Verknuepfung der 
umgebenden geschrieben hast, wodurch deine Anfragen alle nur einmal 
ausgefuehrt werden muessen.

tschau

Sebastian Mendel schrieb:
> Michael Schoenboeck wrote:
> 
> 
>>Originalabfrage:
>>select * from `pix` where id='0815' and usr_name='maxi'";
>>
>>Gibt mir einen datensatz zurück, was auch ok so ist, da ID der
>>primerschlüssel ist
>>
>>Jetzt möchte ich aber auch 5 datensätze passend zu usr_name VOR diesem
>>datensatz und 5 nach diesem datensatz, sortiert nach datum.
>>
>>Das in einer abfrage, wo von mir aus gesamt 10 (11) datensätze geliefert
>>werden...
>>
>>Hm, hat da wer ideen?
> 
> 
> mit UNION ab MySQL 4.0.0:
> 
> 
>     SELECT `pix`.*
>       FROM `pix`
>      WHERE `pix`.`id` = '0815'
>        AND `pix`.`usr_name` = 'maxi'
> 
> UNION
> 
>     SELECT `pix_result`.*
>       FROM `pix`
> LEFT JOIN `pix` AS `pix_5_before`
>         ON `pix`.`usr_name` = `pix_5_before`.`usr_name`
>      WHERE `pix`.`id` = '0815'
>        AND `pix`.`usr_name` = 'maxi'
>        AND `pix_5_before`.`date` < `pix`.`date`
>      LIMIT 5
> 
> UNION
> 
>     SELECT `pix_5_after`.*
>       FROM `pix`
> LEFT JOIN `pix` AS `pix_5_after`
>         ON `pix`.`usr_name` = `pix_5_after`.`usr_name`
>      WHERE `pix`.`id` = '0815'
>        AND `pix`.`usr_name` = 'maxi'
>        AND `pix_5_after`.`date` > `pix`.`date`
>      LIMIT 5
> 
> 
> so in der art ... irgendwie, viel spaß beim rumprobieren!
> 
> 
> 


-- 
Software-Tomography - we make the invisible visible!
Jan Kuehl
Software-Tomography GmbH
Karlstr.7
D-03044 Cottbus
e-Mail: jan.kuehl at software-tomography.com
http://www.software-tomography.com
Phone:  +49 (0355) 4945077
----------------------------



php::bar PHP Wiki   -   Listenarchive