Autor | Zpráva | ||
---|---|---|---|
midlan Profil |
Ahoj, existuje nějaký jednoduchý způsob, jak MySQL přinutit přidat při
LEFT JOIN u NULL hodnotu pro druhou tablku i když odpovídající záznamy byly nalezeny? Pro jednoduchost uvedu příklad
auto (1. tabulka) id | nazev 1 | škoda cestujici (2. tabulka) id_auta | jmeno 1 | Pavel 1 | Jan Výsledek left joinu bude nazev | jmeno škoda | Pavel škoda | Jan Já ale potřebuji výsledek jako tento: nazev | jmeno škoda | Pavel škoda | Jan škoda | NULL Poradí někdo? |
||
Lonanek Profil |
#2 · Zasláno: 6. 5. 2016, 16:25:54
Pokud ten záznam neexistuje pak není co přidávat. V uvedené ukázce máte dva záznamy a Vy z nich chcete udělat 3?
|
||
midlan Profil |
Ano přesně tak. Jakkoliv se to může zdát nesmyslné přesně to potřebuji.
Jednoduše řečeno chci přidat takový řádek, který by left join vrátil pokud by v autě nenašel žádné cestující. |
||
juriad Profil |
SELECT a.nazev, c.jmeno FROM auto a JOIN cestujici c ON a.id = c.id_auta # inner join UNION ALL SELECT a.nazev, NULL as jmeno # druhý dotaz, který doplní NULLy FROM auto a |
||
midlan Profil |
#5 · Zasláno: 6. 5. 2016, 16:46:40
juriad:
Děkuji. Jen bych ideláně potřeboval řešení, které funguje s jedním dotazem. Nad tím výsledkem chci provádět ještě agregační funkce s GROUP BY a celé to bude uložené jako pohled. A mysql v pohledech právě zakazuje poddotazy.
Pokud to možné není, budu muset jako workaround vytvořit pohled i pro ten poddotaz. |
||
juriad Profil |
#6 · Zasláno: 6. 5. 2016, 17:02:29
Jiné řešení mě nenapadá. Zkus popsat proč to potřebuješ, třeba je řešení jinde než u přidávání umělého řádku s NULL.
|
||
midlan Profil |
Pokud budu zcela konkrétní jedná se o systém magento, a já potřebuji součet prodaných ks pro jednotlivé produkty. S tím není problém. Systém má ale i skupinový produkt který sdružuje několik normálních produktů. Já potřebuji i součty prodejů pro tyto skupinové produkty. Zatím nejlepšího výsledku co jsem dosáhl je, že dotaz vrací součty pro osamocené produkty a součty skupinového produktu. Chybí mi ale součty pro jednotlivé produkty zařezené k nějému skupinovému produktu.
/* sales_flat_order_item položka objednávky sales_flat_order objednávka catalog_product_link intersekční tabulka pro ukládání relací mezi produkty, typ 3 je skupinový */ SELECT IFNULL(l.product_id, oi.product_id) AS parent_id, oi.product_id, SUM(oi.qty_ordered - oi.qty_canceled) AS pcs_sold_in_period FROM sales_flat_order_item AS oi INNER JOIN sales_flat_order AS o ON (o.entity_id = oi.order_id) AND (o.state != 'canceled') LEFT JOIN catalog_product_link l ON /* kdyby tento join vracel i null hodnoty jak jsem popsal výše, vše by se vyřešilo */ (l.link_type_id = 3) AND (l.linked_product_id = oi.product_id) GROUP BY parent_id Ještě dodám že tohle celé se snažím uložit jako pohled, což přináší jistá omezení. |
||
TomášK Profil |
#8 · Zasláno: 6. 5. 2016, 17:46:16
Nepomůže vhodně použitý WITH ROLLUP?
|
||
midlan Profil |
#9 · Zasláno: 6. 5. 2016, 18:00:26
midlan, TomášK:
děkuji převelice! vypadá to že dotaz SELECT l.product_id, oi.product_id, SUM(oi.qty_ordered - oi.qty_canceled) AS pcs_sold_in_period FROM sales_flat_order_item AS oi INNER JOIN sales_flat_order AS o ON (o.entity_id = oi.order_id) AND (o.state != 'canceled') LEFT JOIN catalog_product_link l ON (l.link_type_id = 3) AND (l.linked_product_id = oi.product_id) GROUP BY l.product_id, oi.product_id WITH ROLLUP vrací co potřebuji. |
||
Časová prodleva: 7 let
|
0