logo
19.04.2021 14:12
1
Kód:
SELECT id, item_id, user_id, create_time FROM items_log
UNION
SELECT id, category_id, user_id, create_time FROM categories_log
limit 10
Ahoj,

pomocí UNION si chci kombinovat výsledky ze dvou a více tabulek. Bohužel ale sloupečky, které tento SQL dotaz vrátí jsou pouze ty z prvního selectu. Sloupečky z druhého nejsou ve výsledcích dostupné? Lze to nějak ovlivnit?

Třeba by někoho napadlo něco jiného, ale potřebuji na dashboardu v systému vypsat posledních 10 operací uživatele. V databázi mám tabulky, kam se tyto změny ukládají - tj. jsou to v podstatě logy.

Položky mají svůj vlastní log formou tabulky (items_log), uživatelé mají log formou tabulky, kategorie také (categories_log), apod. Tabulky mají vlastně téměř stejnou strukturu. A já potřebuji dát dohromady jeden dotaz, který mi z toho všeho vezme 10 výsledků podle času sestupně. S tímhle řazením, atd si poradím.

Ale nevím, jestli UNION je opravdu to, co chci. Poradíte prosím?

Napadlo mě ještě celé logování dát do jedné tabulky, ale časem to může růst do desítek miliónů záznamů a zdálo se mi lepší to mít rozsekané právě podle typu objektu, ke kterému se logování eviduje.

Co se právě děje na Webtrhu?

19.04.2021 15:02
2
select x.* from
(
SELECT id, item_id, user_id, create_time FROM items_log order by create_time desc limit 10
UNION
SELECT id, category_id, user_id, create_time FROM categories_log order by create_time desc limit 10
)x order by create_time desc limit 10
20.04.2021 08:51
3
Nejak mi nedochazi, co je to "x". To je libovolny sloupec, co chci ziskat? Nebo proc je i za tou posledni zavorkou?

Je fakt, ze ja tohle vyuzivam taky, ale mam ty logy (asi chybne) ve stejne tabulce.

Tohle by ti mohlo pomoci:)

https://www.mysqltutorial.org/sql-union-mysql.aspx/ - je to tam vysvetleno podrobne i treba s rozdilem k JOIN, atd.
20.04.2021 09:46
4
to x je virtuální tabulka, pojmenovává v dotazu ten subselect (je schované za závorkou a tím dojde k pojmenování).

Místo union je lepší použít union all, nedochází pak k deduplikaci hodnot a dotaz je lehce rychlejší. Předpokládám, že ty tabulky obsahují vždy něco jiného.

Důvod proč ti původní dotaz nefungoval je, že limit vzal prvních 10 záznamů, což načetl z první tabulky a na druhou se již nedostal.