Autor Zpráva
midlan
Profil
Ahoj, existuje nějaký jednoduchý způsob, jak MySQL přinutit přidat při LEFT JOINu 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
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
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
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
Nepomůže vhodně použitý WITH ROLLUP?
midlan
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: