Autor Zpráva
moskyt
Profil
Zdravím,

php se učím a občas narazím na problém se kterým se nevím rady. Snažím se hledat na internetu a problém si nastudovat, ale tuto věc prostě nemohu dohledat a vyřešit, tak se ptám zde.

Už delší dobu se potýkám s problémem jak správně pracovat s daty databáze, konkrétně:

Mám databázi eshopu, mám v ní dvě tabulky, jedna obsahuje id produktu a cenu, druhá obsahuje id produktu, název produktu a popis produktu. Jak nejlépe vytáhnout id všech produktů s jejich popisem? Dělám to takto:

$sql_product = ("SELECT * FROM product");
$vysledek_product = MySQL_Query($sql_product);
while($zaznam_product = MySQL_Fetch_Array($vysledek_product)) {
$product_id[] = $zaznam_product[id];
}
$sql_product_desc = ("SELECT * FROM product_description");
$vysledek_product_desc = MySQL_Query($sql_product_desc);
while($zaznam_product_desc = MySQL_Fetch_Array($vysledek_product_desc)) {
$product_desc[] = $zaznam_product_desc[description];
$product_id_desc[] = $zaznam_product_desc[id];
}
$pocetprvku = count($product_id);
$i=0;
foreach ($product_id as $polozka) {
while ($product_id < $i) {
if ($polozka == ($product_id_desc[$i])) echo $polozka." - ".$polozka_desc[$i];
$i++; 
}
}

Čili nejdřív si vlezu do jedné tabulky kde je ID produktu, všechny ID si naskládám do pole $product_id, následně si vlezu do tabulky kde je ID produktu a popis, všechen popis si naskládám do pole $product_desc a ID do pole $product_id_desc, potom si pomocí foreach projdu pole $product_id a uvnitř tohoto cyklu si procházím pomocí while a identifikátoru $i pole z druhé tabulky a pokud se ID rovnají vypíšu si ID + název produktu. Funguje to v pohodě, ale je to hrozně krkolomný postup.

Potřebuji si vytáhnout ID z jedné tabulky a z druhé tabulky si k tomuto ID vypsat název. Dá se to dělat nějak jednodušeji aniž bych musel lézt sólo do obou tabulek, cpát data do polí a ty pole si potom v několika cyklech procházet a porovnávat?

Předem díky za radu.
Kajman
Profil
V tomto případě je asi nejjednodušší spojení.
SELECT p.*,
       d.description
FROM   product p
       LEFT JOIN product_description d
              ON p.id = d.id
Kubo2
Profil
moskyt:
Dá se to dělat nějak jednodušeji
Áno dá, a to tak, že na produkty ti stačí jedna sólo tabuľka. Čili (čiže):

Tabuľka produkty

CREATE TABLE IF NOT EXISTS `produkty`(
    `produkt_id` int(32) NOT NULL AUTO_INCREMENT,
    `produkt_nazov` varchar(30) NOT NULL,
    `produkt_popis` varchar(150) NOT NULL,
    `produkt_cena` float NOT NULL,
    PRIMARY KEY(`produkt_id`)
) ENGINE=MyISAM;
Potom to už len jednoducho vyselektuješ (SELECT * FROM produkty).
moskyt
Profil
Kubo2: no, zapomněl jsem napsat, že se jedná stávající systém...
Kubo2
Profil
moskyt:
V takom prípade viď [#2] od Kajmana.
moskyt
Profil
Kajman: bezva, to je presne ono, diky...
moskyt
Profil
Ještě chci poprosit o radu. JOIN jsem si nastudoval, ale potřebuji ještě složitější spojení tabulek se kterým si nevím rady, potřebuji vypsat id produktu, cenu produktu a kategorii produktu, s tím že tyto údaje jsou ve čtyřech tabulkách takto:

tabulka produkty
| produkt_id | produkt_cena |
| 1 | 548 |
| 2 | 1245 |
| 3 | 658 |

tabulka nazvy_pruduktu
| produkt_id | produkt_nazev |
| 1 | kabelka modra |
| 2 | cepice zelena |
| 3 | boty cerne |

tabulka nazvy_kategorii
| kategorie_id | kategorie_nazev |
| 1 | modni doplnky |
| 2 | boty |

tabulka produkty_kategorie
| produkt_id | kategorie_id |
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |

potřebuji vypsat id produktu, název produktu, cenu produktu, název kategorie, nemám problém si spojit tabulky produkty, nazvy_pruduktu a produkty_kategorie s podmínkami produkty.produkt_id = nazvy_pruduktu.produkt_id a produkty.produkt_id = produkty_kategorie.produkt_id si vypsat čísla produktu s jejich názvy, cenami a čísly kategorií... ale nevím si rady s tím, jak ze čtvrté tabulky dostat názvy kategorií pro jednotlivé produkty.
Kajman
Profil
Bude to stejné, podmínka u tohoto spojení bude
produkty_kategorie.kategorie_id = nazvy_kategorii.kategorie_id

Pokud to nebude fungovat, pošlete sem sestavý dotaz, třeba bude potřeba jen drobná korekce.

Doufám, že si neděláte pro každý sloupec samostatnou tabulku.
peta
Profil
SELECT 
  b.produkt_nazev,
  c.kategorie_nazev,
  d.produkt_cena
FROM
  produkty_kategorie a
    LEFT JOIN nazvy_pruduktu b ON b.produkt_id=a.produkt_id
    LEFT JOIN nazvy_kategorii c ON c.kategorie_id=a.kategorie_id
    LEFT JOIN produkty d ON d.produkt_id=a.produkt_id
Asi by to slo napsat i pres produkty, ale lepsi je ta tabulka s kategoriemi, kde mas hned 2 id a jen k ni dohledas podle id ostatni veci.
juriad
Profil
Představ si to jako takového pavouka:
produkty --JOIN-- nazvy_produktu
         \
          \-JOIN-- produkty_kategorie --JOIN-- nazvy_kategorii
A sem tam přidáš slůvko LEFT, pokud záznam v připojované tabulce nemusí existovat.
moskyt
Profil
skvělé, díky všem...
moskyt
Profil
tak vše mi funguje jak má... ještě mám poslední dotaz, dá se na tomto příkladu nějak odladit aby se nevybíraly duplicitní položky?
nemeja
Profil
Pomůže ti GROUP BY.
Kajman
Profil
moskyt:

A když je výrobek ve více kategoriích, tak se má vybrat jen jedna náhodně? Pokud chcete všechny kategorie, jak je několik způsobů zpracování viz. http://php.vrana.cz/srovnani-dotazu-do-zavislych-tabulek.php
moskyt
Profil
ve více kategoriích nikdy není... jde jen o to že chci vybrat položky zboží a k nim patřičné parametry, ale tak aby všechny byly unikátní (některé se opakují a ve výpise vznikají duplicity)
peta
Profil
DISTINCT? http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html

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: