Autor Zpráva
airie
Profil
Ahoj

Již si nejěkou dobu lámu hlavu jestli lze udělta v DB takovýto dotaz nebo jestli je nutné to obejít nějak jinak např. tříděním v PHP,

mám tabulku

id | datum | dlasi1 | dalsi2 | dalsi3
1 | 2009-1-1 | x1 | x2 | x3
2 | 2009-1-7 | y1 | y2 | y3
3 | 2009-1-14 | z1 | z2 | z3

a pořebuju vytvořit dotaz tak aby mi výsledek dal toto

id | datum | dalsi1 | dalsi2 | dalsi3 | idt2 | idt3 |
1 | 2009-1-1 | x1 | x2 | x3 | 2 | 3 |

přičemž znám datumy u všech třech položek (první zadá uživatel další dva dodá PHP jako následující dva týdný). a Vím že položky budou maximálně 3 resp. musí být tři po sobě jdoucí.

Popsáno slovně
pořebuji udělat dotaz který by vytáhl záznam s nejnižším datem a pak další dva záznamy s tím, že od nich potřebuji znát jen id a to id by zařadil na konec dotazu. Pokud ale v databázi položky s id 2 a 3 nenejade (tyto termíny tam nejsou) tak nezobrazí ani řádek s výsledkem 1 (tj. if idt2 is not null and idt3 is not null).


Víte si s tím někdo rady?? Nebo to nejde a musím to dělat tříděním přes PHP
Kajman_
Profil *
Tak si vytáhněte ty tři řádky a v php se koukněne na všechny. To je snad nejjednodušší, stačí order by a limit.
airie
Profil
no já bych to právě chtěl bez PHP s PHP je mi to jasné - bez PHP bych to chtěl ze svou důvodu:
a) řádkování - tj. možnost použít limit 0,30 protože potřebuji aby my vrátilo 30 řádku s první datumem a né ostatní. Protože to bdue pkračovat takhle:

id | datum | dlasi1 | dalsi2 | dalsi3 | idch
1 | 2009-1-1 | x1 | x2 | x3 | 1
2 | 2009-1-7 | y1 | y2 | y3 | 1
3 | 2009-1-14 | z1 | z2 | z3 | 1
4 | 2009-1-1 | x1 | x2 | x3 | 2
5 | 2009-1-7 | y1 | y2 | y3 | 2
6 | 2009-1-14 | z1 | z2 | z3 | 2

a výsledek potřebuji limit 0,30

id | datum | dalsi1 | dalsi2 | dalsi3 | idt2 | idt3 | idch
1 | 2009-1-1 | x1 | x2 | x3 | 2 | 3 | 1
4 | 2009-1-1 | x1 | x2 | x3 | 2 | 3 | 2
airie
Profil
b) dale mi složitý výpočet zatěžuju server takže další manipulaci s daty v php se chci vyhnout
Kajman_
Profil *
Jak si vybrat minimální datum pro každé idch je ve faq. To pak stačí doplnit o nalezení idt2 a idt3 přes korelované poddotazy a vyfiltrovat nenalezené idt2 a idt3 přes having.
airie
Profil
No nikdy jsem s poddotazy nedělal ale asi chápu jak to myslíš, ale ještě nikdy jsem to nezkoušel v kodu. Nejtežší pro mě bude to "…stačí doplnit o nalezení idt2 a idt3 přes korelované poddotazy…" ostatní snad v poho. Díky
Kajman_
Profil *
select t.sloupecky, 
       (select id from tabulka t2 where t2.idch=t.idch and t2.datum>t.datum order by datum limit 0,1) idt2,
       (select id from tabulka t2 where t2.idch=t.idch and t2.datum>t.datum order by datum limit 1,1) idt3 from tabulkavnizklavyberemnejmensichdatumu t ....
having idt3 is not null
airie
Profil
Tak moc díky za pomoct - pomohlo mi to vyresit problém, po krátké úpravě mi z toho vypadlo rámcově tohle:

Select a.id, , b.id as id2, c.id as id3,
from table a
JOIN table b ON b.termin = a.termin + interval 7 day and a.idch=b.idch
JOIN table c ON c.termin = a.termin + interval 14 day and a.idch=c.idch
WHERE a.termin = '2009-1-1' and b.id IS NOT NULL and c.id IS NOT NULL

Ostatní je jasné - ještě jednou díky
Toto téma je uzamčeno. Odpověď nelze zaslat.