MySQL - 1db SELECT, 2 feltétel
Elnézést, ha valahol már tárgyaltátok, nem találtam rá megoldást a fórumban.
A probléma:
Adva van egy tábla tagokkal.
Tárolom az állapotát (üres-aktív, T-törölt), regisztráció idejét, illetve a lejárat időpontját.
| id | _____reg_datum_____ | _____lejar_datum____| allapot |
| 01 | 2010-01-01 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 02 | 2010-01-01 11:00:00 | 2010-01-10 00:00:00 | _______ |
| 03 | 2010-01-05 08:00:00 | 2010-02-21 00:00:00 | _______ |
| 04 | 2010-01-06 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 05 | 2010-01-06 10:00:00 | 2010-01-27 00:00:00 | ___T___ |
| 06 | 2010-01-07 10:00:00 | 2010-01-12 00:00:00 | _______ |
| 07 | 2010-01-07 10:00:00 | 2010-01-11 00:00:00 | _______ |
Listázáskor a SELECT-et úgy kellene megírnom,
hogy először listázza a még aktív tagokat (vagyis azokat akiknek a lejárat ideje még nagyobb a mostani időpontnál) regisztráció időpontja szerint fordítottan, de regisztráció szerint fordítottan (előre az újabbakat),
majd ugyanígy adja vissza a már nem aktívakat regisztráció szerint fordítottan.
A törölt tag természetesen kimarad a listából.
Ezt kéne megkapnom, ha a dátum 2010-01-18 00:00:00
| id | _____reg_datum_____ | _____lejar_datum____| allapot |
| 04 | 2010-01-06 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 03 | 2010-01-05 08:00:00 | 2010-02-21 00:00:00 | _______ |
| 01 | 2010-01-01 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 07 | 2010-01-07 10:00:00 | 2010-01-11 00:00:00 | _______ |
| 06 | 2010-01-07 10:00:00 | 2010-01-12 00:00:00 | _______ |
| 02 | 2010-01-01 11:00:00 | 2010-01-10 00:00:00 | _______ |
Sajnos a feladathoz a MySQL tudásom kevésnek bizonyult.
■ A probléma:
Adva van egy tábla tagokkal.
Tárolom az állapotát (üres-aktív, T-törölt), regisztráció idejét, illetve a lejárat időpontját.
| id | _____reg_datum_____ | _____lejar_datum____| allapot |
| 01 | 2010-01-01 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 02 | 2010-01-01 11:00:00 | 2010-01-10 00:00:00 | _______ |
| 03 | 2010-01-05 08:00:00 | 2010-02-21 00:00:00 | _______ |
| 04 | 2010-01-06 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 05 | 2010-01-06 10:00:00 | 2010-01-27 00:00:00 | ___T___ |
| 06 | 2010-01-07 10:00:00 | 2010-01-12 00:00:00 | _______ |
| 07 | 2010-01-07 10:00:00 | 2010-01-11 00:00:00 | _______ |
Listázáskor a SELECT-et úgy kellene megírnom,
hogy először listázza a még aktív tagokat (vagyis azokat akiknek a lejárat ideje még nagyobb a mostani időpontnál) regisztráció időpontja szerint fordítottan, de regisztráció szerint fordítottan (előre az újabbakat),
majd ugyanígy adja vissza a már nem aktívakat regisztráció szerint fordítottan.
A törölt tag természetesen kimarad a listából.
Ezt kéne megkapnom, ha a dátum 2010-01-18 00:00:00
| id | _____reg_datum_____ | _____lejar_datum____| allapot |
| 04 | 2010-01-06 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 03 | 2010-01-05 08:00:00 | 2010-02-21 00:00:00 | _______ |
| 01 | 2010-01-01 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 07 | 2010-01-07 10:00:00 | 2010-01-11 00:00:00 | _______ |
| 06 | 2010-01-07 10:00:00 | 2010-01-12 00:00:00 | _______ |
| 02 | 2010-01-01 11:00:00 | 2010-01-10 00:00:00 | _______ |
Sajnos a feladathoz a MySQL tudásom kevésnek bizonyult.
Fordítottan
Egy SELECT-ben kellene
Nem tudok 2 kérést küldeni azon a ponton ahol vagyok.
Nem értem
Hát ha mindenképpen egybe kell
Ha egy querybe akarod, akkor pedig
Bár
LOL
nem ugyanaz a lista lenne
Ha először a regisztráció idejére rendezem és azon belül a lejárat idejére, akkor előfordulhat, hogy a listában szerepel előrébb valaki, aki nemrég regisztrált, de hamarabb jár le a regisztráció (ez nem jó!)
| id | _____reg_datum_____ | _____lejar_datum____| allapot |
| 06 | 2010-01-07 10:00:00 | 2010-01-12 00:00:00 | _______ |
| 07 | 2010-01-07 10:00:00 | 2010-01-11 00:00:00 | _______ |
| 04 | 2010-01-06 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 03 | 2010-01-05 08:00:00 | 2010-02-21 00:00:00 | _______ |
| 01 | 2010-01-01 10:00:00 | 2010-01-20 00:00:00 | _______ |
| 02 | 2010-01-01 11:00:00 | 2010-01-10 00:00:00 | _______ |
Úgy kellene, ahogy fentebb van!
Elöl rendezve az aktívak, majd folytatódik akik már nem azok.
Mindegyik rész rendezve a reg_datum szerint DESC-el
Akkor
SELECT * , 'AKTIV' as c
vagy ha csak a két oszlop kell:
select reg_datum, lejar_datum from ( SELECT * , 'AKTIV' as c FROM tabla WHERE now() between reg_datum and lejar_datum union all SELECT * ,'LEJART' as c FROM tabla WHERE lejar_datum < now() order by c, r1 desc ,r2 ) as t ;
Az állapotot már nem raktam hozzá.
Egyébként ez hasonló mint a 6-os, az is jó, aktivra rendezel és csak utána reg_dátumra.
szuper!!!
Valóban, a 6-os és a 9-es megoldás is megfelelő eredményt hoz.
Most következik ez elmélyülés ezekben a kérésekben, hogy rögzüljenek is bennem!