ugrás a tartalomhoz

MySQL: ORDER BY

hellophp · 2008. Júl. 29. (K), 12.33
Sziasztok!

A segítségeteket kérném, van egy ilyen táblám MySQL-ben:

table: titles
















id title status save_date publish_date
1 Test1 published 2008-07-27 13:09 0000-00-00 00:00
2 Test1 published 2008-07-27 13:15 2000-07-28 08:00
3 Test1 published 2008-07-27 13:15 2000-07-26 08:00


Egy olyan lekérdezést szeretnék írni, ami 6 rekordot ad vissza a titles táblából a következők szerint:
ennek a 6 rekordnak a legfrisebb 6 rekordnak kell lennie, de:
- ha nincs megadva a publish_date mező, akkor a save_date mezőt vegye figyelembe
- ha megvan adva a publish_date mező, akkor a publish_date mezőt vegye figyelembe, de csak akkor vegye bele a listába, ha a publish_date kisebb, mint az aktuális idő (tehát már megjelent ez a cikk)
- illetve a status értéke published

Tulajdonképpen tehát egy olyan megoldást keresek, ami "összegyúrja" a lekérdezés során a save_date és a publish_date mezőt, úgy, hogy a publish_date-nek nagyobb a prioritása (tehát ha ki van töltve, akkor ezt vegye figyelembe).


Köszi,

András
 
1

korrigálás

hellophp · 2008. Júl. 29. (K), 12.34
Sorry, a 2-es és a 3-as rekord publish_date értékénél mindkettő év 2000 helyett 2008.
2

Probáld vmt t-sql switch-case -ekkel

phenotypical · 2008. Júl. 29. (K), 13.09
Szia!

...például:

select top 6 id, title, status
'calculatedDate' = case
when publish_date = 0 then save_date
when publish_date > #now()# then publish_date
end
order by calculatedDate

ezt csak pseudokód mert sietnem kell, de biztos megtenné valami a switch-case -ekkel:
http://www.4guysfromrolla.com/webtech/102704-1.shtml
3

hibaüzenet

hellophp · 2008. Júl. 29. (K), 13.27
Hello,

Ezt a hibaüzenetet kapom:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '6 id, title, status
'calculatedDate' = case
when publish_date = 0 then save_date' at line 1
4

Pszeudokód

zila · 2008. Júl. 29. (K), 13.29
Mint írta is a kolléga csak egy pszeudókódot küldött, ami nem copy-paste módon nyújt megoldást, hanem olvasás és mysql manual alapján történő sql írást jelent...
5

doksiban ezeket nézd meg

virág · 2008. Júl. 29. (K), 13.38
Ha 5-ös MySQL:

http://dev.mysql.com/doc/refman/5.0/en/stored-procedures.html
http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
http://dev.mysql.com/doc/refman/5.0/en/if-statement.html
6

if elég ide

Hodicska Gergely · 2008. Júl. 29. (K), 21.36
Egy sima if függvény elég az order by-ba. Ha nagy a DB-d, akkor viszont szívás, mert amint a MySQL függvényt észlel, eszebe ágába sincs indexet használni, ebben az esetben jobban jársz, ha egy származtatott mezőben letárolod a dátumot.


Üdv,
Felhő
7

Származtatni sem feltétlenül kell

fchris82 · 2008. Júl. 30. (Sze), 12.55
A logika szerint, ha nincs megadva a publish_date, akkor a mentés időpontját kell nézni. Tehát az adat elmentésénél pontosan ezt kell alkalmazni. A publish_date alapértelmezettként legyen egyenlő a save_date-tel, és onnantól csak a publish_date szerint kell sorba rendezni.

Az adatbázisban lévő adatoknál sokkal többször kérdezel le, mint ahányszor írsz, így az ilyen esetekben érdemes beszúrás előtt vacakolni az adatok "előkezelésével", mint utólag szerencsétlenkedni, és lassítani a lekérést, és egy SELECT parancsot telepakolgatni IF-fel. Tehát mielőtt beszúrnád az adatot, ellenőrzöd, hogy a save_date <= publish_date, és utána máris sokkal egyszerűbb (gyorsabb is) a lekérdezés.
8

nem ekvivalens

Hodicska Gergely · 2008. Júl. 30. (Sze), 15.13
Ok, csak én abból indultam ki, hogy van valami oka annak, hogy nem így csinálja, tehát ki van használva az az állapot, hogy az a mező nincs kitöltve. Amúgy ha nem, akkor persze így éri meg.


Üdv,
Felhő
9

Jogos

fchris82 · 2008. Júl. 31. (Cs), 12.33
Valóban, arra az esetre nem gondoltam :)