Autor Zpráva
Jakubbbb
Profil *
Dobrý den, mám tyto dvě tabulky:


Tabulky jsou produkt a varianta. Snažím se vyhledávat pomocí sku a názvu.
Varianta se pozná tak, že je u ní v poli parent sku hlavního produktu.
Lze to vykonat jedním příkazem, abych je vyhledal? Exporimentoval jsem s UNION, ale nedařilo se mi najít výsledky.
$q = $db->query("SELECT */*,product.sku AS sku*/ FROM product LEFT JOIN variation ON product.sku = variation.parent WHERE product.sku LIKE '%$str%' OR variation.sku LIKE '%$str%' LIMIT 25");
Tento kód funguje, ale né tak jak bych potřeboval. Samozřejmně nezobrazí duplicitní pole pokud je nedefinuji viz product.sku AS sku - to zobrazí pouze data hlavního produktu.
Výpis vypadá takto:
stdClass Object
(
    [id] => 
    [sku] => 
    [name] => 
    [manufacturer] => 17
    [spec] => 1
    [size] => 
    [color] => 3
    [in_stock] => 
    [short_desc] => popis...
    [desc] => popis....
    [ean] => 5902745510705
    [price_buy] => 712
    [price_sell] => 889
    [delivery_date] => 1
    [category] => 
    [selled] => 
    [returned] => 
    [lock] => 
    [active] => 
    [parent] => 
)

Budu vděčný za každý tip a radu :)


Tabulky jsou zde:
https://prnt.sc/10dypds
https://prnt.sc/10dypzg
Keeehi
Profil
Jakubbbb:
A co má být výsledkem? Na řádcích mají být namixované jak produkty tak i varianty?
SELECT
  *
FROM (
  SELECT
    "product" AS type,
    id,
    sku,
    name
  FROM
    product
  WHERE
    sku LIKE '%$str%'

  UNION ALL

  SELECT
    "variant" AS type,
    id,
    sku,
    name
  FROM
    variation
  WHERE
    sku LIKE '%$str%'
) t
LIMIT 25

Pokud jsem to špatně pochopil a o tohle ti nejde a tvým jediným problémem je, že ti chybí nějaké sloupce, tak za to nemůže SQL. To nemá vůbec problém s tím, že dva sloupce pojmenuješ stejně.

Samozřejmě, když pak v php necháš výsledek překonvertovat na objekt, tak ten se s tím musí nějak vypořádat. Nevím, jaká je tam logika, ale v důsledku se bude při schodě jmen jeden sloupec ignorovat, protože objekt prostě nemůže mít dva atributy se stejným jménem. Musíš tedy SQL napsat tak, aby jména soupců byla nakonec rozdílná.
    ...
    product.sku AS product_sku,
    variation.sku AS variation_sku,
    ...
Je to hodně psaní a nechce se ti to vypisovat? No, to je možné, ale jinou možnost nemáš. Navíc já třeba hvězdičkový zápis prakticky nikdy nepoužívám (když si něco zkouším tak ano, ale pak v kódu už ne). Ani ne kvůli tomu že by se přenášelo zbytečně více dat, to je ve většině případů zanedbatelné. Ale kvůli tomu že v té rozepsané variantě jsou jasně vidět závislosti. Například pokud by se při nějakých úpravách databáze odstranil sloupec, tak to spadne už při dotaze a ne až někdy možná někde dál v aplikaci.

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:

0