MySQL: ORDER BY
Sziasztok!
A segítségeteket kérném, van egy ilyen táblám MySQL-ben:
table: titles
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
■ 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
korrigálás
Probáld vmt t-sql switch-case -ekkel
...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
hibaüzenet
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
Pszeudokód
doksiban ezeket nézd meg
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
if elég ide
Üdv,
Felhő
Származtatni sem feltétlenül kell
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.
nem ekvivalens
Üdv,
Felhő
Jogos