« 1 2
Autor Zpráva
juriad
Profil
Můžeš použíť:
INSERT INTO tabulka SELECT neco FROM jina_tabulka
Toto přímo vloží do tabulky výsledek SQL dotazu, stačí tedy napsat dotaz tak, aby vracel data v podobě kompatibilní s novými tabulkami. Toto provedeš pro každou novou tabulku.
tomas2245
Profil
a ak by som chcel tovary zo starej objednávky tiež dať do novej tak to ako? asi v PHP unserializovať a tam previesť insert či?
juriad
Profil
Pokud máš data v databázi serializované (což bys nikdy mít neměl), tak ano, musíš použít PHP pro načtení a provedení insertů.
tomas2245
Profil
Ookej, ďakujem ;)
tomas2245
Profil
ešte by som sa chcel spýtať či to správne chápem:

napr. tabuľka objednavky_zakaznik má väzbu s objednavky_info
a ak mám tabuľku objednavka_faktura, objednavka_cena a objednavka_tovar tak tieto všetky tabuľky majú väzbu s objednavky_info a každá tabuľka má stĺpec objednavka_id s hodnotou tabuľky z objednavka_info že? totiž, neviem že keď budem pripájať všetky tieto tabuľky tak môžu mať väzbu stále s tou jednou príklad:

$vobj = mysqli_query($pripoj,"SELECT *
FROM objednavky_zakaznik oz
JOIN objednavky_info oi ON oz.id = oi.zakaznik_id
JOIN objednavky_tovar ot ON oi.id = ot.objednavka_id
JOIN objednavky_cena oc ON oi.id = oc.objednavka_id
JOIN objednavky_faktura of ON oi.id = of.objednavka_id WHERE zakaznik_id = '$idecko'");
Tomášeek
Profil
tomas2245:
totiž, neviem že keď budem pripájať všetky tieto tabuľky tak môžu mať väzbu stále s tou jednou príklad:
Ano, je to tak správně. Ostatně sis mohl zkusit, jestli ten dotaz vrátí, co má. Každá vazba se v tomto případě vyhodnocuje zvlášť, není důvod přes oi.id připojit objednavky_cena, když už je předtím připojena objednavky_tovar.
tomas2245
Profil
skúšal som a vracia to dobre...ako to myslíš že nie je dôvod cez oi.id pripojiť objednavky_cena ? ako by ten môj dotaz potom vyzeral?
Tomášeek
Profil
tomas2245:
ako to myslíš že nie je dôvod cez oi.id pripojiť objednavky_cena
Mělo tam být není důvod nepřipojit.

Zkrátka, že víceré napojení na jeden sloupec jedné tabulky (oi.id) nevadí a je to tak správně :-)
tomas2245
Profil
okej :)

inak neviem prísť na problém prečo mi tento dotaz vráti objednávku napr. 4x, keď je o nej všade len jeden záznam..

$vobj = mysqli_query($pripoj,"
  SELECT * FROM objednavky_zakaznik oz 
  JOIN objednavky_info oi ON oz.id = oi.zakaznik_id 
  JOIN objednavky_tovar ot ON oi.id = ot.objednavka_id 
  JOIN objednavky_cena oc ON oi.id = oc.objednavka_id  
  WHERE skupina = '1' AND stav = 'nie' 
  ORDER BY oz.id DESC");

while($vobj2 = mysqli_fetch_array($vobj)){

$vrat_objednavku .= '  informácie o nej...  ';

}
juriad
Profil
tomas2245:
Protože vytahuješ z databáze i tovary, tedy počet vrácených záznamů bude stejný jako počet tovarů. Máš dvě možnosti:
1) smířit se s tím a nějak si to vyřešit v PHP
2) položit dva dotazy: jeden na objednávku bez tovarů a druhý jen na tovary konkrétní objednávky.
tomas2245
Profil
aaaaach no vidíš to ma nenapadlo :D diiik :)
tomas2245
Profil
a keď vypíšem napr. 2 objednávky naraz, tak ako by sa dali priradiť tovary k jednotlivým objednávkam?

ak chcem vypísať tovary k jednej objednávke to stačí len pomocou $_GET zistiť id a dopísať WHERE... ale ako by to bolo u viacerých?
Kajman
Profil
tomas2245:
ako by sa dali priradiť tovary k jednotlivým objednávkam?

Tady je nástin různých přístupů
Srovnání dotazů do závislých tabulek
tomas2245
Profil
skúšam niečo takéto pomocou GROUP_CONCAT ale neviem prísť na to, aby to fungovalo správne:

neviem ešte ako tam pripojiť ostatné tabulky..

živá ukážka

<?php

SELECT objednavka_id, GROUP_CONCAT(tovar ORDER BY tovar ASC SEPARATOR ',')
FROM (
  SELECT objednavka_id, CONCAT(tovar, ':', GROUP_CONCAT(pocet ORDER BY pocet ASC SEPARATOR ',')) AS tovar
  FROM objednavky_tovar ot
  GROUP BY objednavka_id, tovar
) AS A JOIN objednavky_zakaznik ON ot.objednavka_id = oz.id
GROUP BY objednavka_id;

?>

výstup je takýto:

id         tovar
1          Kniha: 4, Zošiť: 8
2          Pero: 9

ale ako tam pridať aj meno, priezvisko zákazníka z inej tabuľky? aby bol výstup:

id      meno     priezvisko               tovar
1       Jožko     Mrkvička           Kniha: 4, Zošiť: 8
2        Ján       Novák                  Pero: 9


a ďalšia vec je že, aj keď to bude v jednom riadku pomocou toho GROUP_CONCAT tak pri tom výpise ako by som to dal napr. Kniha: 4 <br> Zošiť: 8?
juriad
Profil
tomas2245:
GROUP CONCAT je určeno spíš jako hack, než něco, co by se mělo používat. Je jen málo datábází, které něco takového nabízí a mají k tomu dobrý důvod - řešení formátování nemá být řešeno v databázi. Z možných řešení jsi si vybral asi to nejméně vhodné.

Ten vnitřní dotaz nedává úplně smysl, celé to jde nahradit za:
SELECT oi.*, oz.*, GROUP_CONCAT(CONCAT(ot.tovar, ': ', ot.pocet) ORDER BY ot.tovar ASC SEPARATOR ' <br> ') AS tovary
FROM objednavky_info oi 
JOIN objednavky_zakaznik oz ON oz.id = oi.zakaznik_id
JOIN objednavky_tovar ot ON ot.objednavka_id = oi.id
GROUP BY oi.id;

(Pořád si myslím, že tabulky spojuješ divně, takže si ty ON podmínky asi musíš upravit podle své situace.)

Bez zvýrazněné části tomu dotazu asi rozumíš. Připojením tabulky objednvaky_tovar se ti namnoží počet řádků, kterého se zbavíš tím GROUP BY. Nakonec jen potřebuješ pomocí GROUP_CONCAT reprezentovat každou skupinu (tovary v objednávce).
tomas2245
Profil
ja viem, že ich spojujem divne, ale rozhodol som sa ich spojovať len s objednavka_id... čize objednavky_tovar, objednavky_info, objednavky_cena toto všetko má väzbu s objednavky_zakaznik......Je to pre mňa jednoduchšie takto používať... a ďakujem :)
tomas2245
Profil
môžem ešte otázku? že prečo si tak veľmi chcel aby som mal zakaznik_id a objednavka_id ? len čisto z toho že keby som chcel napr. zaviesť registrácie?
juriad
Profil
Ono ani nejde o to zavedení registrací. Lépe se o tom konceptuálně přemýšlí.

Když si vezmu ten tvůj příklad: zákazník vytvoří objednávku, která se skládá z produktů. Máme tedy tři entity, které jsou spolu nějak svázané:
Jaký je vztah mezi zákazníkem a objednávkou? Zákazník má objednávky (0 a víc). Objednávka patří vždy právě jednomu (1) zákazníkovi. Tomuto typu vazby se říká N:1 (nebo 1:N, podle směru).
Jaký je vztah mezi objednávkou a produktem? Objednávka obsahuje produkty (1 a víc). Produkt může být obsažen v nějakých objednávkách (0 a víc). Tomuto typu vazby se říká M:N.
Jaký je vztah mezi zákazníkem a produktem? Žádný.

Jaké atributy má zákazník? Jméno, příjmení, nějaký kontakt.
Jaké atributy má objednávka? Kdy byla založená, celková cena, kam ji doručit, vybraný způsob dopravy, poznámka.
Jaké atributy má produkt? Název, popis, cena.

Jaké atributy má mít vazba mezi zákazníkem a objednávkou? Asi nic není, protože vazba je 1:N, vždy je tedy možné přidat informaci do strany s N (což je v tomto případě objednávka).
Jaké atributy má mít vazba mezi objednávkou a produktem? Počet, hodí se cena (protože cena uložená v produktu se může měnit), může se hodit celková cena (množstevní slevy, akce).

Toto je přibližně všechno, co bys mohl kdy chtít modelovat. Ty však chceš začít s něčím menším (vynechat atributy je možné ty lze později snadno přidat; vynechat entity ještě asi také půjde za cenu duplicity dat v databázi), ale změnit vazby mezi entitami mění pohled na celý model.

Všimni si, že jsem doposud nemluvil o tabulkách a sloupcích v databázi. To totiž přijde, až když máš hotový takovýto model; pak provedeš transformaci do tabulek v datábázi:
1) Z entity se stane tabulka; každá tabulka entity bude mít jako primární klíč id; atributy entity se stanou sloupci tabulky.
2) Vazba 1:1 mezi X a Y se vyřeší jedním z možností (která to bude, závisí na tom, zda některá ze stran vazby může být nulová):
- spojení tabulek propojených entit do jedné (místo tabulek X a Y bude tabulka XY)
- přidáním sloupce X_id do Y
- přidáním sloupce Y_id do X.
3) Vazba 1:N mezi X a Y se vyřeší přidáním sloupce X_id do tabulky Y. (A přesně opačně pro vazby N:1)
4) Vazba M:N mezi X a Y se vyřeší přidáním vazební tabulky X_Y se sloupci X_id a Y_id (tyto dva sloupce dohromady budou tvořit primární klíč).
5) Pokud vazba má atributy (což myslím nastane jen u M:N vazby), tak patří jako sloupce do vazební tabulky.
Toto je docela automatický postup, který ti z popisu, co jak s čím souvisí, vytvoří databázové schéma.

Když se koukáš na tabulky v databázi, tak vlastně nepřemýšlíš o tom, že tabulka má nějaké sloupce a že sloupec id má shodnou hodnotu jako sloupec X_id v jiné tabulce, ale přemýšlíš o tom modelu, jak jsem ho popsal výše: jak jsou spolu jednotlivé entity propojené. V ideálním případě, pokud dodržuješ nějakou konvenci - třeba jak jsem ji načrtnul výše v 5 bodech - přecházíš mezi modelem a tabulkami v databázi automaticky; dokonce tabulky v databázi tak chápeš - jejich úkolem není být tabulkou, ale realizovat nějakou část modelu.

Podobně jako jako odvodíš tabulky z modelu, můžeš z něj odvodit dotazy. Jejich psaní se pak většinou stane rutinou, protože ti bude přesně jasné, proč jaký JOIN s jakou vazební ON podmínkou máš použít.

Když jsi tedy vytvořil databázi, ve které není zakaznik_id, ale naopak zakaznik má objednavka_id, tak jsi namodeloval svět, ve kterém zákazník nemá nějaké objednávky, ale naopak objednávka má zákazníka. A pokud bys byl důsledný, tak se tento způsob myšlení projeví i jinde v aplikaci. Než abys vytvořil omezený model, ty jsi vlastně vytvořil jiný model, a pokud jej časem budeš chtít rozšířit, je možné, že to bude stát víc práce.

Chápu, že s databázemi začínáš a že větší množství tabulek a různých joinů může být děsivé, ale databáze je jen nástroj, který používáš k implementaci modelu. Také chápu, že je pro tebe teď mnohem jednodušší přemýšlet o tom, že máš jednu centrální tabulku objednávek a k ní připojuješ další docela stejným způsobem.
tomas2245
Profil
a ak chcem zistiť objednavka_id daného zákazníka dám pred to napr. takýto dotaz?

$zisti_objednavkaid = mysqli_query($pripoj,"
SELECT oi.id FROM objednavky_info oi
JOIN objednavky_zakaznik oz ON oi.zakaznik_id = oz.id
WHERE oz.id='$idecko'");
$zisti_objednavkaid = mysqli_fetch_array($zisti_objednavkaid);

$id_objednavky = $zisti_objednavkaid['id'];

foreach($post_tovar as $kluc_tovar => $obsah_tovar){

$nazov_tovar = mysqli_query($pripoj,"SELECT nazov FROM produkty WHERE pc='$kluc_tovar'");
$nazov_tovar = mysqli_fetch_array($nazov_tovar);nazov_tovar = $nazov_tovar['nazov'];

    $zapis_tovar = mysqli_query($pripoj,"INSERT INTO objednavky_tovar (objednavka_id, pc, nazov, pocet) 
        VALUES ('$id_objednavky', '$kluc_tovar', '$nazov_tovar', '$obsah_tovar') ON DUPLICATE KEY UPDATE pocet=pocet+VALUES(pocet)");
}

inak ešte taká dodatočná otázka v tabuľkách: objednavky_cena, objednavky_faktura, objednavky_tovar je id s AUTO INCREMENTOM zbytočné že? keďže slúžia len ako spojenie s objednavky_info pomocou stĺpca objednavka_id..?

a tú M:N väzbu musím použiť alebo mi to stačí použiť takto:

1:N väzba (všade):

- objednavka_zakaznik: má svoje id s AUTO INCREMENT
- objednavka_info: zakaznik_id a id s AUTO INCREMENT //väzba s objednavka_zakaznik (oz.id)
- objednavka_tovar: objednavka_id //väzba s objednavka_info (oi.id)
- objednavka_cena: objednavka_id //väzba s objednavka_info (oi.id)
- objednavka_faktura: objednavka_id //väzba s objednavka_info (oi.id)
tomas2245
Profil
Viem že je zakázané obnovovať tému, vopred sa ospravedlňujem, ale pokiaľ hocikto by mi vedel poradiť budem rád. Pretože potrebujem čím skôr dostať odpoveď na moje otázky, viem že ma už máte možno plné zuby, ale musím tieto posledné veci doriešiť...
Kcko
Profil
tomas2245:
Tak si kup nějakou pěknou knihu o MySQL a začni hezky od začátku. Stavíš e-shop a nemáš ani základy a třeba mě osobně už tohle vlákno leze na nervy.
Tohle je diskusní fórum kam můžeš přijít pro radu s nějakým problémem, ale ty jich máš skutečně hodně a opakuji je to diskusní fórum, ne dlouhodobý průvodce pro začátečníky co se vrhnou na větší aplikaci bez zkušeností a základů, které musí mít!
tomas2245
Profil
V poriadku, je to tvoj názor obyčajného smrteľníka bez právomocí na tejto stránke, existuje Adblock môžeš si tam túto tému zablokovať pokiaľ ťa už táto téma obťažuje. Oslovujem ľudí ktorí majú chuť pomáhať, momentálne tvoj príspevok nemá žiadnu hodnotu. A ak by si si aspoň trochu preštudoval o čom je toto vlákno tak je to len kolotoč ktorý sa točí furt o tom istom a moje otázky v [#19] si chcem len utvrdiť aby som si bol na 100% istý že to robím správne. :)
« 1 2

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