ugrás a tartalomhoz

MySQL - 1db SELECT, 2 feltétel

peachman · 2010. Szep. 27. (H), 16.43
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.
 
1

Fordítottan

Poetro · 2010. Szep. 27. (H), 17.04
SELECT * FROM table WHERE lejar_datum >= NOW() 
  AND allapot <> 'T' ORDER by reg_datum DESC, id DESC
és
SELECT * FROM table WHERE lejar_datum < NOW() 
  AND allapot <> 'T' ORDER by reg_datum DESC, id DESC
Már nem tudom mit kell fordítottan, mert az nem derült ki, minden fordult.
2

Egy SELECT-ben kellene

peachman · 2010. Szep. 27. (H), 17.09
Igen, erre gondoltam én is, de egy SELECT-el kellene megoldanom valahogy.
Nem tudok 2 kérést küldeni azon a ponton ahol vagyok.
3

Nem értem

Poetro · 2010. Szep. 27. (H), 17.13
Akkor miért akarod elkülöníteni a lejártat a még nem lejárttól, ha úgyis kell mindkettő? Nem teljesen világos. Elvégre a rendezés is ugyan olyannak tűnik.
SELECT *, lejar_datum >= NOW() AS aktiv FROM table WHERE    
  AND allapot <> 'T' ORDER by reg_datum DESC, id DESC
6

Hát ha mindenképpen egybe kell

thgab · 2010. Szep. 27. (H), 17.26
SELECT *, lejar_datum >= NOW() AS aktiv FROM table WHERE      
  AND allapot <> 'T' ORDER by aktiv DESC, reg_datum DESC, id DESC
4

Ha egy querybe akarod, akkor pedig

thgab · 2010. Szep. 27. (H), 17.15
SELECT * FROM table WHERE lejar_datum >= NOW() AND allapot <> 'T'
UNION 
SELECT * FROM table WHERE lejar_datum < NOW() AND allapot <> 'T' 
ORDER by reg_datum DESC, id DESC
5

Bár

thgab · 2010. Szep. 27. (H), 17.22
így nem sok értelme van :D
LOL
7

nem ugyanaz a lista lenne

peachman · 2010. Szep. 27. (H), 19.16
Amiért külön kellene csinálni:

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
8

Akkor

thgab · 2010. Szep. 28. (K), 08.21
9

SELECT * , 'AKTIV' as c

vastagl · 2010. Szep. 28. (K), 22.43
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 ;

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.
10

szuper!!!

peachman · 2010. Szep. 29. (Sze), 13.26
Köszönöm a segítséget thgab és vastagl felhasználóknak.

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!