Autor Zpráva
maks
Profil
Ahoj,
nějak jsem se ztratil ve tvoření dotazu, s databazemi na tom nejsem nikterak dobře, můžu vás požádat o pomoc? Asi to nebude úplně dokonalé, ale takto mi to stačí, jen se z toho vymotat. Provádím nějaké větší či menší úpravy na eshopu, který jsem dostal na starost. Našel jsem http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=106704, ale je to nad moje chápání :(

O co jde: Mám tři tabulky
- siteprefs (sitepref_value, sitepref_name - obecná nastavení webu) - podstatné jsou 3 řádky, kde je name:value následující d0prct:0, d1prct:10, d2prct:20 ("d" + kód dph (stejný jako v tabulce produktů vat) + "prct")
- cart (product_id, ... - nákupní košík)
- products (product_id, vat, price, ...)) // vat = kód dph (0-2), price = cena bez DPH

a potřebuji následující:
zjistit sazbu DPH pro každý konkrétní produkt z košíku. Jinak, než podobným složitým dotazem to zjišťovat nepůjde, eshop by se musel asi trochu překopat, aby se do košíku ukládala jak cena s DPH, tak i bez DPH, ale do toho se mi nechce. To jsem radši strávil teď dvě hodiny hraní si s tímto. Snad to nebyl ztracený čas :).

SELECT sitepref_value val 
FROM siteprefs sp, cart c 
  JOIN products prods ON right(left(siteprefs.sitepref_name, 2),1) = prods.vat --zjistím číslo = kód sazby, o jakou se jedná. Zkraje jsem to špatně pojmenoval, proto left a right, ořížnutí přebytečných znaků
  JOIN prods ON c.product_id = prod.product_id --id produktu v košíku a tabulce produktů - abych vybral sazby jen těch produktů, které jsou v košíku
WHERE char_length(sitepref_name) = 6 and right(sitepref_name, 4) = 'prct' --podmínka, abych opravdu vybral jen ty procentní sazby a ne třeba řádek se sitepref_name = a2abcd (ten tam samozřejmě není :-), jen příklad).
and ... --tady už jsou jen nějaké autentifikační podmínky, nezajímavé.


Za boha se nemůžu zbavit chyby Unknown column 'siteprefs.sitepref_name' in 'on clause' (v ukázce ř. 3). Zkoušel jsem to bez názvu tabulky, zkoušel jsem i sp.sitepref_name, ale za boha nic. Když ten první JOIN vyhodím (ř. 3), chyba zmizí a dotaz se vykoná, ale není to ten dotaz, co potřebuju.

A ano, vím o tom, že ty podmínky s LEFT a RIGHT jsou nepěkné, bohužel, je to tak - to není předmětem dotazu, funguje to. Pro moje účely to stačí.

Díky za rady a pomoc
Kajman_
Profil *
FROM (siteprefs sp, cart c)

http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=111963#4
maks
Profil
Kajman:
děkuji, toto trochu pomohlo. Teď dotaz neukazuje žádné chyby, ale vrací špatný počet řádků (v košíku mám např. 3 položky, ale vrátí mi to 15 řádků). Dotaz zůstal stejný, poslední podmínka je ID košíku (abych vybral data jen tohoto přihlášeného uživatele), k výběru soupců jsem si přidal i sitepref_name, product_id, abych viděl, co se mi vypisuje.

cart - obsahuje tři položky, k nimž chci zjistit DPH (product_id = 1, 3, 4)
products - obsahuje všechny položky, z nichž podstatné jsou ty z košíku (product_id: vat = 1:1, 3:2, 4:1) (první a třetí položka mají sazbu 1 = 10%, druhá sazbu 2 = 20% DPH)
siteprefs - obsahuje spoustu dat, podstatné jsou 3 řádky "v0prct", "v1prct" a "v2prct" s hodnotami 0, 10 a 20 (%).

SELECT sitepref_value val, sitepref_name nam, c.product_id cpi, c.cart_id cid 
FROM (siteprefs sp,cart c) 
JOIN products prods ON right(left(sp.sitepref_name, 2),1) = prods.vatcode 
JOIN products prod ON c.product_id = prod.product_id 
WHERE char_length(sp.sitepref_name) = 6 and 
  right(sp.sitepref_name, 4) = 'prct' and 
  c.cart_id = '...'

# Výpis:
#  cpi: nam   val
#  1:  v1prct     10
#  1:  v1prct     10
#  3:  v1prct     10
#  3:  v1prct     10
#  4:  v1prct     10
#  4:  v1prct     10
#  1:  v2prct     20
#  1:  v2prct     20
#  1:  v2prct     20
#  3:  v2prct     20
#  3:  v2prct     20
#  3:  v2prct     20
#  4:  v2prct     20
#  4:  v2prct     20
#  4:  v2prct     20




Ještě to můžu zkusit slovně vysvětlit, co je mým záměrem, resp. jak bych to dělal více jednoduchými dotazy (což je asi téměř jistě neefektivně při větším množství zákazníků). Je to opravdu jen nástřel, pokud by byl ten složitější dotaz výše nepochopitelný (vím, že jak to napíši níže, to fungovat nemůže). Je to jen nástřel, za foreach by šla použít formulka IN (), ale i tak je to špatně.

1. zjistění id produktů, které jsou v košíku. Výsledek bych si uložil do proměnné pid.
SELECT product_id FROM cart WHERE cart_id = '...'

2. zjištění označení sazby - foreachem
SELECT vat FROM products WHERE product_id = pid
. Teď bych dostal pole (1, 2, 1).
3. zjištění hodnoty sazby DPH - opět foreachem
SELECT sitepref_val FROM siteprefs WHERE char_length(sitepref_name) = 6 and right(sitepref_name, 4) = 'prct'
.


Ještě jednou děkuji za pomoc.
Kajman_
Profil *
Zkuste si vypsat všechny sloupce díky *, ať zjistíte, kde se Vám to násobí spojením bez správné podmínky.
maks
Profil
Kajman:
zkusil jsem SELECT sp.* i SLEECT c.*, zbytek stejný, obojí mi vypsalo 15 řádků.

Popravdě, moc jsem nepochopil, kam tenhle pokus měl mířit - neříkám, že byl špatný, to v žádném případě. Jen jsem ho nepochopil :(.

ať zjistíte, kde se Vám to násobí spojením bez správné podmínky.
začátek věty jsem pochopil, konec - posl. 3 slova - nikoliv. Ty podmínky mi, laickým pohledem, připadají dobré (1. kde product.vat (0-2) je stejný jako číslo v nějakém řetězci. To jsem zkoušel, na příkladu výpisu výše je vidět, že to najde sprvné řádky (alias NAM)). Druhý join id produktu v košíku = id produktu v produktech. Zkoušel jsem joiny i přehazovat
, nic.
Kajman_
Profil *
Když dáte
select * from ...

tak se řádky nijak neliší?

Nebo si zkuste postupně přidávat tabulky do joinů, ať zjistíte, kde se to násobí. Možná, že chybí v podmínkách vazba mezi tabulkami prods a prod, ale těžko říct, vazby znáte jenom Vy.
maks
Profil
Kajman:
Možná, že chybí v podmínkách vazba mezi tabulkami prods a prod
to jsou dva aliasy pro jednu a tutéž tabulku PRODUCTS. Když jsem měl
...
JOIN products prods ON right(left(sp.sitepref_name, 2),1) = prods.vatcode 
JOIN prods ON c.product_id = prods.product_id ...

měl jsem chybu
Not unique table/alias: 'prods'. Proto jsem přistoupil k druhému aliasu ve druhém joinu. Že by byl problém tady tedy?



Případně, měl bys jiný nápad, jak dotaz lépe sestavit? Já se v tom trochu plácám, určitě nemám znalosti tvého rozsahu. Potrebnou strukturu tabulek jsem uvedl výše.
I tak jsem ti moc vděčný, že se mi snažíš pomoci.
Kajman_
Profil *
Když dáte
select * from ...


tak se řádky nijak neliší?

Nebo si zkuste postupně přidávat tabulky do joinů, ať zjistíte, kde se to násobí. Těžko říct, kde máte špatně podmínky pro provázání, vazby znáte jenom Vy!
maks
Profil
Kajman:
Když dám za select c.* (cart.*) nebo sp.* (siteprefs.* ), vrátí to vždy 15. výsledků. Když smažu jeden nebo druhý JOIN, výsledků zůstává 15 (JOINY to tedy neovlivňují).

Pravděpodobně jsi myslel to zjednodušení na SELECT * FROM takto:
SELECT * FROM cart where cart_id = 'abc'   --vrací správně 3 výsledky.
SELECT sp.* FROM (cart c, siteprefs sp) WHERE c.cart_id = 'abc'   --vrací 15 výsledků. Může to být tím, že ve FROM jsou 2 tabulky, přestože vybírám z jedné? Pokud tam není CART, píše mi to chybu Unknown column 'cart.session_id' in 'where clause'


EDIT: v tabuilce CART (neodeslané košíky) je 7 záznamů, 3 s tímto konkrétním Cart_ID (cart_id není id košíku, to je AI samožřejmě, je to session_id klienta, ke kterému patří. Jsou to tedy tři položky uživatele se session_id = abc).
Kajman_
Profil *
Spojení tabulek je vždy všechny řádky se všemi, pokud to omezení nějakou vazbou nedefinujete ve where nebo on.
http://www.linuxsoft.cz/article.php?id_article=827
+následujících pár dílů, ať pochopíte základy spojování tabulek

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