Autor Zpráva
glerak
Profil *
Zdar všem.
Prosím o radu - je li to v MySQL řešitelné (V opačném případě to pořeším v PHP, ale vnesu si další zmatek to kódu).

Mám tabulku:
mysql> SELECT time_write, id_tema FROM clanek LIMIT 5;
+---------------------+---------+
| time_write          | id_tema |
+---------------------+---------+
| 1999-10-31 00:00:00 |       1 |
| 2000-09-02 00:00:00 |       1 |
| 2001-12-21 00:00:00 |       1 |
| 2002-12-30 00:00:00 |       1 |
| 2003-08-30 00:00:00 |       1 |
+---------------------+---------+
5 rows in set (0.00 sec)

Podle mých představ funguje
mysql> SELECT MAX(YEAR(clanek.time_udalost)) AS rok FROM clanek WHERE clanek.id_tema = 1;
+------+
| rok  |
+------+
| 2010 |
+------+
1 row in set (0.00 sec)


Už ale není dle mých představ toto:
mysql> SELECT MAX(YEAR(clanek.time_udalost)) AS rok FROM clanek WHERE clanek.id_tema = 2;
+------+
| rok  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)


Hrozně rád bych MySQL donutil,aby mi v tom druhém případě vrátila 0 výsledků, a nikoliv NULL. Je nějaká možnost?

Děkuji za rady.
ShiraNai7
Profil
Nenapada me jak by to jednoduse slo. A posuzovani v PHP pomoci isset (pripadne === null) mi neprijde jako vnaseni zmatku.
Kajman_
Profil *
SELECT IFNULL(MAX(YEAR(clanek.time_udalost)),0) ...
glerak
Profil *
Kajman:
Díky, ale nepotřebuji vrátit '0', alebrž nula řádků :-)
ShiraNai7:
Ok, díky. Jasné, jenom mi už nestačí mnou používané
if (!$result=DotazNaDB($sql)...

Jasně - je to drobnost, ale myslel jsem, že to musí jít na straně DB :-) S tím zmatkem je to spíše narážka na můj už tak dosti zmatečný kód...
Kajman_
Profil *
having rok is not null
glerak
Profil *
Kajman:
Moc díky za snahu, ale nějak si s tím stejně neumím poradit. Porád mi něco vrací. Nejspíš to prostě nejde.
Ta funkci MAX asi holt neznásilním.
mysql> SELECT MAX(YEAR(clanek.time_udalost)) IS NOT NULL AS rok FROM clanek WHERE clanek.id_tema = 2;
+-----+
| rok |
+-----+
|   0 |
+-----+
1 row in set (0.00 sec)

mysql> SELECT MAX(YEAR(clanek.time_udalost)) AS rok FROM clanek WHERE clanek.id_tema = 2 AND clanek.time_udalost IS NOT NULL;
+------+
| rok  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)

Neumím moc dobře anglicky, takže jsem možná někde něco přehlédl, ale fakt jsem se snažil hledat.


Každopádně, ve finále jsem (už jenom z důvodu "to přece musí nějak jít") vyplodil tohle:
mysql> SELECT YEAR(clanek.time_udalost) AS rok FROM clanek WHERE YEAR(clanek.time_udalost) = (SELECT MAX(YEAR(clanek.time_udalost)) FROM clanek) AND clanek.id_t
ema = 1 LIMIT 1;
+------+
| rok  |
+------+
| 2010 |
+------+
1 row in set (0.00 sec)

mysql> SELECT YEAR(clanek.time_udalost) AS rok FROM clanek WHERE YEAR(clanek.time_udalost) = (SELECT MAX(YEAR(clanek.time_udalost)) FROM clanek) AND clanek.id_t
ema = 2 LIMIT 1;
Empty set (0.00 sec)

mysql>


Ale nejsem si jist, jestli je to k použití... :-)
TomášK
Profil
glerak
viz Kajmanova rada:
SELECT MAX(YEAR(clanek.time_udalost)) AS rok FROM clanek WHERE clanek.id_tema = 2 having rok is not null;

WHERE filtruje záznamy před groupováním, having po něm.
glerak
Profil *
TomášK:
Super, funguje to. Jsem zase o něco chytřejší :-)

Díky všem za rady :-)
Kajman_
Profil *
Ještě jedna poznánka
SELECT YEAR(MAX(clanek.time_udalost)) AS rok

By mohlo být za určitých okolností výrazně rychlejší.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0