Autor Zpráva
Tomiiiiiiiik
Profil *
Ahoj, jsem tady zase po nějaké době asi s blbou otázkou, co se týká složitějšího selectu, vím, že existují manuály, ale tam mi to moc nikdo nevysvětlí a kdo ví, jestli se to dá takto přes SQL dotaz řešit, potřebuji udělat následující:

Odebírám SMS zprávy od jedné nejmenované firmy, každá SMSka je nějakým způsobem zpoplatněna, chci si udělat affiliate program. V databázi si ukládám pro každou SMS zprávu nějaké provize pro mé affiliate zákazníky, tabulka vypada takto:

tabulka: sms_provize
sloupce: idzakaznika,smstm3, sms023,smsvf3,smstm6,sms026,smsvf6 az smsvf79 (sms je jen oznaceni ppro provize, 2pismenka je zkratka operatora a cislo za tim je cena za SMSku), pro kazdeho zakaznika bych si chtel urcovat nejake provize, takze v kazdem radku muzu mit jine provize u danych cenovych hladin. Ted to delam tak, ze mam pro kazdou cenovou hladinu napr. smstm3 jeden SQL dotaz a ten si davam do promene, na konci scriptu sectu všechny SMS za 3 Kč s ostatníma hladinama a vynásobím počtem SMS za 3 Kč, které došly od O2, T-Mobile a Vodafone, což je zdlouhavé, vím, že mi neporadíte asi ihned, protože mé vysvětlení je asi pro Vás nechápavé, ale myslím si, že touto diskuzí se k problému dostaneme.

Potřebuji tedy jeden SQL dotaz, který by mi dokázal dát do proměných SMS ze všech cenových hladin a také rozlišoval dle operátora, abych mohl tyto provize násobit počtem doručených SMS od daného operátora. Firma, která mi poskytuje tyto SMSky affiliate takto nenabízí, takže bych si to chtěl udělat sám, ale s SQL nejsem takový kamarád ;o) Dokážete mi prosím poradit? Potřebuji v závěru vlastně spočítat provize mého zákazníka kolik mu mám vyplatit a aby měl zákazník informaci o tom, kolik SMS mu došlo, jaké provize má za každou SMS dle operátora apod.

Děkuji moc těm, kteří se mi budou snaźit poradit ...
Tomiiiiiiiik
Profil *
Ještě, abych tady vložil svůj odkaz, takto složitě jej mám udělané, když mi přibude další hladina těžko se mi zde bude přidávat, myslím si, že to dělám složitě:

$sSQL = "SELECT * FROM sms_provize WHERE idklienta='$cisloklienta'";
$qpsms->query($DBpsms, $sSQL);
$pocet_domen = $qpsms->numrows();
$rec = $qpsms->getrow();
$id_klienta = $rec["id"];
$cena_sms_klienta = $rec["cenasms"];
$odpocet_firmy = $rec["odecist"];
// Eurotel
$eurotel_provize_db3 = $rec["eurotel3"];
$eurotel_provize_db6 = $rec["eurotel6"];
$eurotel_provize_db8 = $rec["eurotel8"];
$eurotel_provize_db10 = $rec["eurotel10"];
$o2_provize_db15 = $rec["o215"];
$eurotel_provize_db20 = $rec["eurotel20"];
$eurotel_provize_db30 = $rec["eurotel30"];
$eurotel_provize_db40 = $rec["eurotel40"];
$eurotel_provize_db50 = $rec["eurotel50"];
// T-mobile
$tmobile_provize_db3 = $rec["tmobile3"];
$tmobile_provize_db6 = $rec["tmobile6"];
$tmobile_provize_db8 = $rec["tmobile8"];
$tmobile_provize_db10 = $rec["tmobile10"];
$tmobile_provize_db15 = $rec["tmobile15"];
$tmobile_provize_db20 = $rec["tmobile20"];
$tmobile_provize_db30 = $rec["tmobile30"];
$tmobile_provize_db40 = $rec["tmobile40"];
$tmobile_provize_db50 = $rec["tmobile50"];
// Oskar
$oskar_provize_db3 = $rec["oskar3"];
$oskar_provize_db6 = $rec["oskar6"];
$oskar_provize_db8 = $rec["oskar8"];
$oskar_provize_db10 = $rec["oskar10"];
$vodafone_provize_db15 = $rec["vodafone15"];
$oskar_provize_db20 = $rec["oskar20"];
$oskar_provize_db30 = $rec["oskar30"];
$oskar_provize_db40 = $rec["oskar40"];
$oskar_provize_db50 = $rec["oskar50"];
// Pevné sítě
$pevna_provize_db3 = $rec["pevne3"];
$pevna_provize_db6 = $rec["pevne6"];
$pevna_provize_db8 = $rec["pevne8"];
$pevna_provize_db10 = $rec["pevne10"];
$ostatni_provize_db15 = $rec["ostatni15"];
$pevna_provize_db20 = $rec["pevne20"];
$pevna_provize_db30 = $rec["pevne30"];
$pevna_provize_db40 = $rec["pevne40"];
$pevna_provize_db50 = $rec["pevne50"];

Pak vlastne vsechno scitam, odecitam,... coz je hodne slozite :-(
TomášK
Profil
tabulka: sms_provize
sloupce: idzakaznika,smstm3, sms023,smsvf3,smstm6,sms026,smsvf6 az smsvf79
2pismenka je zkratka operatora a cislo za tim je cena za SMSk


Struktura té tabulky si přímo říká o to, aby ses na tom zasekl. Pokud ji můžeš změnit, předělej to, třeba takto:
zakznik(id)
operator(id)
tarif(id, cena, operator_id)
sms(zakaznik_id, tarif_id)

Pak budeš mít dotazy, které potřebuješ na pár řádků. Nevím, co ten zdroják v php má přesně dělat, ale je to zlo.
Tomiiiiiiiik
Profil *
TomášK

Ahoj, teď to trošku nechápu jak to mám upravit ... např. zmiňované:

tarif(id, cena, operator_id)
sms(zakaznik_id, tarif_id)

:-(

To co jsem poslal je script, který teď funguje, ale je složitý, do proměných načítá patřičné provize pro určité operátory :-(
TomášK
Profil
Já určitě nechci tvrdit, že to nefunguje, já jen tvrdím, že ten kód jde napsat daleko lépe. Příčinu, proč ten kód je složitý vidím v tom, že operátory a ceny za sms ukládáš v názvech sloupců - špatně se s tím pracuje, což určitě sám vidíš.

Proto bych zvolil jinou strukturu tabulek, místo jedné hned 4:
zakznici(id, jmeno, ...)
operatori(id, firma, ...)
tarify(id, cena, operator_id)
sms(zakaznik_id, tarif_id)

Id je vždy primární klíč, abych mohl jednoznačně identifikovat záznamy v dané tabulce.


zakaznici - seznam zakazniku (1, Franta), (2, Pepa) atd.
operatori - seznam operatoru (1, O2), (2, TMobile), ...
tarify - operator_id je cizí klíč, ukazuje na záznam v tabulce operátoři, abych věděli, kterému operátorovi tarif patří a cena je cena za jednu sms
záznam (id = 1, cena = 3, operator_id = 1) říká, že operátor 1 (což je O2) má tarif, ve kterém dává sms za 3Kč.

sms - když přijde sms, přidáš záznam do téhle tabulky, např (zakaznik_id = 2, tarif_id = 1) znamená, že Pepa poslal sms za 3Kč u operátora O2 (to lze dohledat z tarifu).

Kdybych teď chtěl třeba celkovou cenu, kterou stály sms jednotlivých operátorů, tak to zjistím dotazem
SELECT operatori.firma SUM(cena) FROM sms JOIN tarify ON tarify.id = sms.tarif_id JOIN operatori ON operatori.id = tarify.operator_id GROUP BY operatori.id


Musel bych studovat, co přesně myslíš provizí - ale nad touhle strukturou to pravděpodobně bude dotaz na pár řádků. Ty to děláš asi na 50 řádků tak, že když k tomu někdo přijde, tak bude ještě o vánocích zjišťovat co a proč se s čím sčítá a odčítá ;-)
Tomiiiiiiiik
Profil *
TomášK

Tak s tabulkama už to chápu ... Prave, ze mam jednu tabulku kde je ID zakaznika a nejake udaje o nem (cislo uctu,...)
Dalsi tabulka jsou prijate SMSky
Dalsi je prave ta kde jsou provize a ty prave jsem mel udelane ze v jednom radku bylo jen ID zakaznika a pak ty provize, takze to udelam tak jak rikas:

provize:
ID|idcenysms|provize
------------------------------
idzakaznika, 1,30.20

pak bych se s tim zkusil poprat tak jak si mi poslal ten select ;o)

Vyzkousim, pripravim a dam vedet ;o) Zatim diky moc

Co se tyka toho kodu, prave jsem ho proto psal, protoze podle me je to moc slozite a potreboval jsem jej nejak zkratit ;o)
Tomiiiiiiiik
Profil *
TomášK

Tak jsem se konečně dostal k tomu SQL dotazu, problem je nasledujici, nějakým způsobem mi nenačítá SQL dotaz:

SELECT operatori.nazev SUM(provize) FROM sms_prichozi JOIN provize ON provize.idoperatora = sms_prichozi.tarif_id JOIN operatori ON operatori.id = provize.idoperatora GROUP BY operatori.id

Vraci chybu:

Va-Bąe syntaxe je nějaká divná bl-Bízko 'SUM(provize) FROM sms_prichozi JOIN provize ON provize.idoperatora = sms_prichoz' na řádku 1
Tomiiiiiiiik
Profil *
Tak jsem se na to pořádně podíval, takže chyba byla jen v SELECT operatori.nazev SUM(provize) FROM kde musi vypadnout operatori.nazev
Kajman_
Profil *
Nebo to nevyhodit a dát za to čárku.
Tomiiiiiiiik
Profil *
Kajman_

Jojo, to jsem udělal, ještě bych měl jeden dotaz, jelikož se stále nemohu zorientovat v tomto SQL, poradíš mi prosím jak udělat SQL, který mi teda vypíše poskytovatele a celkové provize pro daneho poskytovatele? Jde to v jednom SQL nebo pro kazdeho musim udelat SELECT samostatne? Chtel bych aby byl vysledek takovy:

T-mobile: 200 Kč provize
O2: 134,20 Kč provize
Vodafone: 15 Kč provize

Díky moc
Kajman_
Profil *
Však ten dotaz, co tu máte, by to měl dělat. Klasické sum na jednotlivých čáskách a group by operator.
Tomiiiiiiiik
Profil *
Kajman_

No to mi prave nedela, mozna jsem se v nem zamotal :-( Chybelo tam par carek potom asi AS atd. Mozna tam nekde nasadit DISTINCT nebo neco podobneho ... Ono mi to vypisuje totiz provize pro kazdeho operatora zvlast tudiz napr.

T-mobile: 2
T-mobile: 0.50
T-mobile: 3,20
O2: 3
Vodafone: 1.15
atd.
Kajman_
Profil *
Musíte nasadit group by na operátora.
Tomiiiiiiiik
Profil *
Kajman_

No to je pro mě španělská vesnice :-( Group by tam mam tak jak je to tady, ale stejne ho to zobrazuje :-(
Kajman_
Profil *
Tak ukažte dotaz, co vypíše alespoň ty provize, sečíst by to pak již neměl být problém.

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: