Ahoj, mám problém. Mám dotaz
$dotaz = mysql_query('SELECT * FROM ((user LEFT JOIN zaznamy ON user.usr_option1 = zaznamy.zaz_id and user.usr_option2 = zaznamy.zaz_id) ) ');
chci aby se z DB user z dvou sloupcu (option1 a option2) ktere obsahuji id cislo nacetl z DB Zaznamy patricny nazev zaznamu roven id zaznamu.
DB user
usr_id - usr_name
DB zaznamy
zaz_id - zaz_nastaveni
vysedkem dotazu by melo byt:
Uživatelské jméno: $usr_name
Option1: $zaz_nastaveni
Option2: $zaz_nastaveni
Fórum › PHP
Propojení DB
Dej si se svym prispevkem trochu praci a poradne to vysvetli. Z tohodle absolutne netusim, o co se vlastne snazis.
Btw, proc tam mas tolik tech zavorek?
No mám dvě databáze. Prvni se jmenouje USER a obsahuje ID,JMENO,OPTION1,OPTION2 a pak mam druhou databázi Options která obsahuje ID,HODNOTA.
USER - databáze
usr_id / usr_jmeno / usr_option1 / usr_option2
1 / pajin / 2 / 4
2 / adéla / 1 / 3
OPTIONS - databáze
opt_id / opt_hodnota
1 / barva
2 / písmo
3 / velikost
4 / styl
.
.
a chci jedni dotazem dostat: id uzivatele, jmeno uzivatele a misto cisel v option1 a option2 chci dostat nazev hodnoty v DB OPTIONS.
Chci dále vypsát vše cyklem a seřadit podle opt_hodnota.
Aha,, tak za prve: databaze je cely ten datovy model, ktery se sklada z tabulek, ktere se skladaji ze zanamu. To cemu ty rikas databaze jsou tabulk ;)
A bude to takhle:
SELECT * FROM user, options AS opt_1, options AS opt_2 WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2 AND ...nejaka tvoje podminka
a jeste par veci:
1) u pojmenovani objektu v myqsl se radsi vyhni velkym pismenum, je to pak prehlednejsi, velka pismena nech pro klicova slova jazyka
2) primarni sloupec je podle me lepsi pojmenovavat jenom "id", neavisle na tom do ktere tabulky patri. Na toto se ale nazory ruzni
3) jak chces radit podle opt hodnota, kdyz je to varchar (predpokladam)?
A jeste jedna poznamka - pouzivani hvezdicky misto senzamu poli u joinovanych vyrazu vede k peknemu pordelu. I pro optimalizaci je lepsi, kdyz vyjmenujes, ktera pole chces vytahnout.
Btw, zaregistruj se alespon, kdyz uz si tu davam tu praci a radim ti ;)
Príště taky prosím umístit do cekce databáze. Nepřemisťuji, protože systém tě nemá jak upozornit na přemístění :)
To CommanderZ :
díky za odpověď a mám jeden dotaz.
proč si tabulku options vybiral dvakrat a pod jinym aliasem?
zrovna nedavno sem psal sql dotaz, kde sem potreboval zjistit pocet vazeb a to dvou typu. a nepodarilo se mi. pokud sem zjistoval je jedny vazby, bylo to ok. ale jakmile jsem tam mel obe join zaraz, tak to nejak ty cisla motalo.
je toto nejake reseni, jak se podobnym problemum vyhnout?
diky
Tak jsem registrován :)
Dekuji za rady.
Mám ale problém s tim dotazem na databázi. Problém je ze ty id v option1 a option2 jsou rozdilna a v tabulce OPTIONS jsou na ruznych radcich. Tento dotaz mi dokaze zpracovat jen jeden option1 ale druhy uz ne protoze ma jine id a tedy je na jinem radku v tabulce OPTIONS
To hrach :
Problem je v tom, ze potrebujes propojit k "domovskemu radku" z tabulky users dva RUZNE radky z jine tabulky. A to jinak nezajistis. Btw, v jednom projektu jsem jednu tabulku joinoval asi 12x :)
To zaroven odpovida i na autorovu otazku: proto se ta tabulka joinuje 2x se dvema ruznymi aliasy. Prostuduj si to poradne ;)
Neeee, podivej se poradne na ten priklad, tam to mas presne napsane:
SELECT * FROM user, options AS opt_1, options AS opt_2 WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2 AND ...nejaka tvoje podminka
Takze ti to rozeberu hezky slovo po slovu
SELECT * FROM
snad chapes, jestli ne nak nevim co tu chces :)
user,
Zakladni tabulkou bude tabulka "user". Ono by to mohlo vyznet tak, jakoze zalezi na poradi v jakem v tomto seznamu tabulky uvedes, coz rzhodne neni pravda. MySQL si optimalizuje poradi tabulek tak jak se mu hodi, diky podminkam (viz dale) je ale stejne naprosto jasne, ze "user" tou zakladni tabulkou bude.
options AS opt_1, options AS opt_2
Vedle tabulky "user" budeme dvakrat vybirat z tabulky options. Proto, ze budeme vybirat ze dvou ruznych radku, ji musime pripojit dvakrat. A jelikoz by ti mysql vyhodilo hybu, ze mas ve vyctu dve tabuly stejne mojmenovane (presneji, chyba by nastala pri praci s daty z techto tabulek. Reklo by ti to,z e pojmenovani "options" je viceznacne, coz nesmi), takze si musime alespon jednu z techto dvou instanci pojmenovat aliasem. Alias - tedy predzdivka - je alternativni jmeno, pod kterym se bude s tabulkou dale pracovat. Alias je vzdy uveden za slovickem AS. Ja jsem v tom priklade pro prehlednost priradil alias obema instancim te tabulky.
WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2
Tady je zajisteno vlastni propojeni. Jak vidis, tak se zde jiz nepracuje s nazvem tabulky "options", ale s aliasy.
Jestli to nechapes, taks i dukladne precti nejake tutorialy na joiny, ono obcas muze byt slozite si to predstavit (coz zrovna rozhodne neni tento pripad)
dekuji za vystvetleni. Mel jsem v tom zmatek ale uz to asi chapu. Jen nevim. Mam
$dotaz = mysql_query = ("SELECT * FROM user, options AS opt_1, options AS opt_2 WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2");
while($radek = mysql_fetch_array($dotaz)):
//chci ziskat ty dve option hodnoty
echo $radek['opt_hodnota'];
endwhile;
ale vraci mi to jen jednu. Proc?
Spatne to chapes, oni se vrati obe v jednom vyusledku. Vypis si cele to asoc pole pomoci print_f a tam to uvidis.
cheeester
a to vypisi jak? print_f jsem uz videl ale nevim jak to funguje
Myslím, že spíše bylo myšleno print_r() - http://php.net/print_r. Ale doporučuji používat var_dump() - http://php.net/var_dump - protože poskytne více informací.
no tak mam:
$dotaz = mysql_query = ("SELECT * FROM user, options AS opt_1, options AS opt_2 WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2");
while($radek = mysql_fetch_assoc($dotaz)):
//chci ziskat ty dve option hodnoty
print_r ($radek['jmeno']);
endwhile;
ale vraci mi to stale jen jednu hodnotu :(
Sry za to _f, v PHP uz jsem asi mesic a pul nic nepsal.
$dotaz = mysql_query = ("SELECT * FROM user, options AS opt_1, options AS opt_2 WHERE opt_1.opt_id=user.usr_option1 AND opt_2.opt_id=user.usr_option2");
while($radek = mysql_fetch_assoc($dotaz)):
//chci ziskat ty dve option hodnoty
print_r ($radek);
endwhile;
Tohle ti vypise vsechna vracena data...jako pole
Mel by ti vypsat obsah pole ve formatu v jakem se v PHP pole zapisuji, pokud ti nic nevypisuje, tak je neke neco spatne.
no pokud vypisi ten cyklus bez print_r tak to jede v pohode jen mi to nevrati oba option ale jen jeden z nic. Pomoci print_r($radek); by to melo udelat co? Nevim jakym kodem dostat z print_r($radek); ty data v podobe jako klasicky z databaze v poli while($radek = mysql_fetch_assoc($dotaz)):
echo $radek['option1'];
echo $radek['option2'];
.
.
.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C++ propojeni — založil
Propojení s webem — založil RePRO
Propojení formulářů — založil razzo7335
Moderátoři diskuze