Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
David Jančík
Vlastník
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
Tvůrce
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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger: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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
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 Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger: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
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
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
Vlastník
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
Vlastník
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
Tvůrce
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.