Autor Zpráva
jirka
Profil *
potrebuju neco vybrad z DB a mam cas udaju v jedne tabulce a cast v druhe co jsou to klice? jak presne funguje finkce group???? koukam do knizky ale, ne a ne to pochopit :( diky
Leo
Profil
To zalezi na tom, jaky je mezi tabulkami vztah, Leo
jirka
Profil *
no prave to netusim co mam nastavit :) co znamena primary key (primarni klic) v MY_SQL proste mam dve tabulky: diskoteky a akce kdyz vyplnim akce tj napr. datum 5.5.2005, diskoteka 1 tak chci aby php potom vybralo z dotazu uz automaticky vsechny udaje ktere mam v tab. akce a k tomu v tabulce diskoteky vybralo udaje k diskotece id 1, tusim ze se to gela group, ale vubec nevim jak, kdyz jsem opsal priklad z knizky, tak to nefungovalo :(
Ivan
Profil *
Taky nejsem zadnej profik, ale zkus tohle:
SELECT * FROM akce LEFT JOIN diskoteky ON akce.diskoteka = diskoteky.id
tzn.: left join je pripojit tabulku a co je za ON, tak to je jaky parametry jsou si rovny. pred teckou je nazev tabulky a za teckou je nazev sloupce. Kdyby neco, tak se ozvy..
Melo by to fungovat. (snad jsem tam neudelal zadnou blbou chybku) ale tohohle vzoru by ses mel drzet podle toho, cos popsal. Cau Ivan
jirka
Profil *
clovece asi jsem hroznej lempl!!!!!! me to nejak nejede :( zrejme mam spatne neco v te tabulce kde se musi nastavit primary key pomoooooc nebo aspon púriklad na php.net jsem to poradne nensel vysvetlene :(
Leo
Profil
Docela by pomohlo kdybyste podrobne napsal jaka je struktura tech dvou tabulek, co do nich ukladate a co z nich chcete vytahnout, Leo
Leo
Profil
Tak napiste lidskymi slovy :-) jaky je vztah mezi akci a diskotekou, Leo
Honza Hučín
Profil
Když mám dvě tabulky a jejich údaje spolu souvisejí, musejí mít aspoň jedno pole (sloupec) stejný. Takové pole, přes které spolu souvisejí. Pole se nemusí nutně jmenovat v obou tabulkách stejně, ale mělo by obsahovat v obou tabulkách hodnoty podobného typu. Dotaz do databáze pak spojí takové záznamy (řádky) z obou tabulek, které mají hodnotu propojovacího pole stejnou.

Například mám v jedné tabulce všechny lidi ze třídy a ve druhé tabulce všechny členy nějakého klubu. A zajímá mě, kteří lidé ze třídy jsou zároveň členy klubu. V obou tabulkách mám pole jmeno, které jednoznačně identifikuje člověka (kdyby mohlo mít víc lidí stejné jméno, použiju třeba rodné číslo).

V jazyku databáze se to řekne takhle: "Vypiš záznamy, které mají v tabulce trida stejnou hodnotu pole jmeno jako v tabulce klub". Přeloženo do jazyka SQL:

select * from trida, klub where trida.jmeno=klub.jmeno;

S primárním klíčem to až tolik nesouvisí. Primární klíč je vhodné mít kvůli indexování tabulek, což zrychlí přístup. Ale dotaz bude fungovat i bez něho. Jiná věc je, že se tabulky často propojují ne přes jméno, ale přes nějaké ID. Ovšem to už je další stupeň databázové nirvány.
jirka
Profil *
dekuju vsem za cas a trpelivost s lamou :) !!!!!!!!!!!!!!

takhle to mam ted :( a je to spatne to vim,musim psat vsechno dvakrat, do tab. "programy" a pak jeste do tabulky "diskoteky" ale ja chci aby se vsechny udaje o diskotece vypsaly pres
MySQL_Fetch_Array($vysledektop) automaticky tim by odpadlo spousta prace (nemusel bych to vypisovat do tabulek dvakrat :) )

##### tabulka programy ############

CREATE TABLE `programy` (
`id` smallint(2) NOT NULL auto_increment,
`datum_akce` date NOT NULL default '0000-00-00',
`styl` varchar(255) character set latin2 NOT NULL default '',
`misto` varchar(255) character set latin2 NOT NULL default '',
`url_na_mapu` text,
`nazev` varchar(255) character set latin2 NOT NULL default '',
`url_na_poradatele` varchar(255) character set latin2 default NULL,
`dj` varchar(255) character set latin2 default NULL,
`komentar` varchar(255) character set latin2 NOT NULL default '',
`nazev_diskoteky` varchar(255) character set latin2 NOT NULL default '',
`id_diskoteky` smallint(2) NOT NULL default '0',
`zobrazit` tinyint(1) NOT NULL default '1',
KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1250 AUTO_INCREMENT=43 ;

##### tabulka diskoteky############

CREATE TABLE `diskoteky` (
`id` int(11) NOT NULL auto_increment,
`nazev` varchar(255) NOT NULL default '',
`misto` varchar(255) default NULL,
`url_na_mapu` text,
`tel` varchar(255) default NULL,
`web` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2 AUTO_INCREMENT=9 ;


vysledek by mel vypadat takto levy sloupec PROGRAMY :: akce podle data, ted to vypisuju pres jednu tabulku programy:


function program_datum()
{
$vypisprogram = MySQL_Query("SELECT * FROM programy WHERE datum_akce >= CURDATE() ORDER BY datum_akce");
if(!$vypisprogram)
{
echo "v tabulce <b>programy</b> nejsou žádné údaje, nebo nastala chyba na SQL"."\n";
}else{
while ($zaznamprogram = MySQL_Fetch_Array($vypisprogram)){
echo '<b>'.date('d. m. y', strtotime($zaznamprogram['datum_akce'])).' | '.$zaznamprogram["nazev_diskoteky"].'</b><br><div class="seda">'.$zaznamprogram["nazev"].' &raquo; <a href="'.$zaznamprogram["url_na_poradatele"].'" title="zobrazí web pořadatele akce">web</a> &raquo; <a href="'.$zaznamprogram["url_na_mapu"].'" title="zobrazí disko na mapě">mapa</a></div> <div class="modra">styl: '.$zaznamprogram["styl"].'</div>';
echo 'dj´s: '.$zaznamprogram["dj"].'<br>'.$zaznamprogram["komentar"].'';
echo "<hr>";
}
}
}

ale chtel bych to prave jednim selectem vypisovat najednou ze dvou tabulek programy a diskoteky ulechcilo by me to moc prace, tusim ze to bude asi nejak pres GROUP BY ale nevim jak :(

diky moc vsem kdo se tim zabivaji jirka
Ivan
Profil *
Tak hele, trochu jsem to zkoukl a tabulky musíš trochu poopravit na:

PROGRAMY
id
datum_akce
styl
nazev
url_na_poradatele
dj
komentar
id_diskoteky
zobrazit

DISKOTEKY
id
nazev
misto
url_na_mapu
tel
web

Jo a zrušil jsem ti sloupce primary key a misto nich dopln u IDcek:
INT PRIMARY KEY AUTO_INCREMENT
Tim je nastavíš jako primární klíče.
Ostatní hodnoty si doplň.

A pak by měl fungovat výběrový dotaz něco jako:

SELECT * FROM programy LEFT JOIN diskoteky ON programy.id_diskoteky = diskoteky.id WHERE programy.datum_akce >= CURDATE() ORDER BY programy.datum_akce


Je to všechno z hlavy, tak je možný že to neni stopro...
Pokud na to ještě někdo koukne tak ať to ještě doladí.
Honza Hučín
Profil
Tak se zkusíme přiblížit. Nefungovalo by něco takového?

SELECT * FROM programy, diskoteky WHERE datum_akce >= CURDATE() and programy.id_diskoteky=diskoteky.id ORDER BY datum_akce
jirka
Profil *
super lidi ted to na PhpMyAdmin funguje jste skveli!!!!!! ale ted mi jeste poradte jak mam udelat ten zapis s polem MySQL_Fetch_Array??? protoze to nevipise nic, ajak rozlisim napr nazev z tab. programy a nazev z tabulky diskoteky??? --- $zaznamprogram["nazev"] ---- jeste jednou diky lidicky
Ivan
Profil *
tak jeste si prejmenuj výběrové pole v tabulce a to samotnym výběrem:

SELECT *, programy.nazev AS pr_na FROM programy LEFT JOIN diskoteky ON programy.id_diskoteky = diskoteky.id WHERE programy.datum_akce >= CURDATE() ORDER BY programy.datum_akce

Funckí AS zajistíš přejmenování - platí jen pro samotný výběr.
Takže česky: vybrat všecho, z tabulky programy pole nazev přejmenuj na pr_na z tabulky programy atd...

Pole pak jednoduše voláš novým názvem.

Zkus to. Jsem zvědavej jak se to povede. Mělo by to jít...
jirka
Profil
jooooooo lidi uz to funguje !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! tohle nej nej nej studnice vedeni :) diky moc lidi!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Toto téma je uzamčeno. Odpověď nelze zaslat.

0