Pouze tento týden sleva až 80% na e-learning týkající se Kotlinu
Využij akce až 80% zdarma při nákupu e-learningu. Více informací .
BF summer
Avatar
David Jančík
Tým ITnetwork
Avatar
David Jančík:12.8.2013 17:47

MySQL lvl Kit's kid.

SELECT * FROM (
        (SELECT "article" AS `type`, CONCAT("%article% ", `title`) AS `title`, `url`, DATE_FORMAT(`last_change`, "%a, %d %b %Y %T") AS `date`, `icon_path`, `description` AS `content` FROM `articles` WHERE `keywords` != "" AND `description` != "" LIMIT 5)
UNION ALL
        (SELECT * FROM (
                (SELECT "comment_unregistered" AS `type`, CONCAT("%comment-from% ", `c`.`nick`, " %to-article% ", `a`.`title`) AS `title`, CONCAT(`a`.`url`, "/vsechny-prispevky#comment-", `c`.`comment_id`) AS `url`, DATE_FORMAT(`c`.`published`, "%a, %d %b %Y %T") AS `date`, "" AS `icon_path`, `c`.`content`
                                        FROM `comments` AS `c`
                                        INNER JOIN `articles` AS `a` USING (`article_id`)
                                        WHERE `c`.`user_id` IS NULL)
        UNION ALL
                (SELECT "comment_registered" AS `type`, CONCAT("%comment-from% ", `u`.`nick`, " %to-article% ", `a`.`title`) AS `title`, CONCAT(`a`.`url`, "/vsechny-prispevky#comment-", `c`.`comment_id`) AS `url`, DATE_FORMAT(`c`.`published`, "%a, %d %b %Y %T") AS `date`, "" AS `icon_path`, `c`.`content`
                                        FROM `comments` AS `c`
                                        INNER JOIN `users` AS `u` USING (`user_id`)
                                        INNER JOIN `articles` AS `a` USING (`article_id`)
                                        WHERE `c`.`user_id` IS NOT NULL)
        ) AS `comments` LIMIT 10)
) AS `items` ORDER BY `date` DESC

Kókni na to, estli to tak móže býsť. Šílenost strašná :D

Odpovědět
12.8.2013 17:47
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík
Kit:12.8.2013 18:02

Při zběžném pohledu to vypadá docela OK, jen funkci DATE_FORMAT() bych raději vypíchl do vnějšího selectu, protože uvnitř bude dělat bugr při sortu. Také se to tím trochu zjednoduší.

Nahoru Odpovědět
12.8.2013 18:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:12.8.2013 18:26

Teď tu debatujeme o výkonové stránce těch UNIONů, docela by mě to zajímalo.

Nahoru Odpovědět
12.8.2013 18:26
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:12.8.2013 18:33

UNION ALL nijak nezatěžuje DB server, ale naopak je výhodnější než samostatné dotazy.

Napsal bych to asi jinak, ale moc se mi v tom šťourat nechce.

Teď ale koukám, že jsou tam zcela zbytečně rozdělováni registrovaní a neregistrovaní uživatelé. A máme hned o jeden UNION ALL méně.

Nahoru Odpovědět
12.8.2013 18:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:12.8.2013 18:44

David Jančík právě říkal, že měl ten UNION pomalý, také mi to přijde divné. Jak bys vyřešil ty registrované a neregistrované? Chce pokaždé vybrat něco jiného.

Nahoru Odpovědět
12.8.2013 18:44
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:12.8.2013 18:49

Tam se používá LEFT JOIN a hodnoty NULL se odchytávají přes COALESCE().

Nahoru Odpovědět
12.8.2013 18:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík:12.8.2013 19:18

Tohle je cool to si půjčím. Akorát, jak mám udělat, když chci něco jako:

SELECT `c`.*, COALESCE(`u`.`nick`, `c`.`nick`)

Musím ty hodnoty vypsat manuálně nebo to jde nějak pošéfit?

Nahoru Odpovědět
12.8.2013 19:18
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na Kit
David Jančík:12.8.2013 19:22

Lol, tak ono to funguje. Sem myslel, že to bude nějak kolidovat, ale ono to prostě tu hodnotu přepíše podle toho co bylo zadáno jako poslední.

Nahoru Odpovědět
12.8.2013 19:22
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík
Kit:12.8.2013 19:25

Nevím, jestli to chápu správně, ale to by snad mělo být triviální:

SELECT `c`.*, COALESCE(`u`.`nick`, `c`.`nick`) AS `nick`

K hvězdičce mohu přidat i další sloupce.

Nahoru Odpovědět
12.8.2013 19:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.