Avatar
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

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:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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:

David Jančík [sczdavos] 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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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

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

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
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na Kit
David Jančík [sczdavos]:

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  +1 12.8.2013 19:22
Čím více času dostaneš, tím méně ho máš.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
Kit:

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.