Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

[DONE]un tabel care leaga intre ele 2 inregistrari din altul
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> Alte baze de date
Subiectul anterior :: Subiectul următor  
Autor Mesaj
johnutz



Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură

Trimis: Vin Dec 01, 2006 7:29 pm    Titlul subiectului: [DONE]un tabel care leaga intre ele 2 inregistrari din altul  

Am 2 tabele:

utilizatori
id_utilizator
nume

si:

mesaje
id_mesaj
id_utilizator_expeditor
id_utilizator_destinatar
data_ora
mesaj

Ca sa obtin toate informatiile despre mesaj ar fi o interogare:
Cod:
SELECT
utilizatori.nume AS expeditor,
utilizatori.nume AS destinatar,
mesaje.data_ora,
mesaj
FROM mesaje
JOIN utilizatori ON utilizatori.id_utilizator=mesaje.id_utilizator_expeditor
JOIN utilizatori ON utilizatori.id_utilizator=mesaje.id_utilizator_destinatar
, de la care ma aleg cu Citat: #1066 - Not unique table/alias: 'utilizatori'
Banuiesc ca e din cauza ca am pus de 2 ori JOIN utilizatori...
Cum sa o scot la capat?
Desigur ca pot sa pun interogari suplimentare ca sa aflu expeditorul si destinatarul din id-uri, dar o singura interogare e cel mai elegant...

// edit: am pus in interogare utilizatori.nume in loc de utilizatori.id_utilizator; era gresit inainte, pt ca _numele_ ma intereseaza...
Sus  
johnutz



Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură

Trimis: Vin Dec 01, 2006 9:29 pm    Titlul subiectului:  

OK, s-a rezolvat!
Hai sa dau toate datele:

Tabelele:
Cod: CREATE TABLE `mesaje` (
  `id_mesaj` int(10) unsigned NOT NULL auto_increment,
  `id_utilizator_expeditor` int(10) unsigned NOT NULL default '0',
  `id_utilizator_destinatar` int(10) unsigned NOT NULL default '0',
  `data_ora` datetime NOT NULL default '0000-00-00 00:00:00',
  `mesaj` text NOT NULL,
  PRIMARY KEY  (`id_mesaj`),
  KEY `id_utilizator_expeditor` (`id_utilizator_expeditor`,`id_utilizator_destinatar`)
) ;
-- 
INSERT INTO `mesaje` (`id_mesaj`, `id_utilizator_expeditor`, `id_utilizator_destinatar`, `data_ora`, `mesaj`) VALUES (1, 1, 2, '2006-04-07 12:25:30', 'neatza :P');
INSERT INTO `mesaje` (`id_mesaj`, `id_utilizator_expeditor`, `id_utilizator_destinatar`, `data_ora`, `mesaj`) VALUES (2, 3, 1, '2006-12-04 21:06:00', 'salut ba');
-- 
-- 
CREATE TABLE `utilizatori` (
  `id_utilizator` int(10) unsigned NOT NULL auto_increment,
  `nume` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id_utilizator`)
) ;
-- 
INSERT INTO `utilizatori` (`id_utilizator`, `nume`) VALUES (1, 'gigi');
INSERT INTO `utilizatori` (`id_utilizator`, `nume`) VALUES (2, 'vasile');
INSERT INTO `utilizatori` (`id_utilizator`, `nume`) VALUES (3, 'ion');
INSERT INTO `utilizatori` (`id_utilizator`, `nume`) VALUES (4, 'gheorghe');


Interogarea:
Cod: SELECT
ue.*,
ud.*,
mesaje.*
FROM mesaje
JOIN utilizatori ue ON ue.id_utilizator=mesaje.id_utilizator_expeditor
JOIN utilizatori ud ON ud.id_utilizator=mesaje.id_utilizator_destinatar

"ue" si "ud" sunt alias-uri pt acelasi tabel "utilizatori"!!!
Sus  
carco



Data înscrierii: 27/Mai/2004
Mesaje: 2796
Locație: Bucuresti

Trimis: Sâm Dec 02, 2006 10:25 am    Titlul subiectului:  

E ok insa obisnuieste-te sa folosesti AS pt. a pune alias-uri la tabele. E si codul mai clar si eviti anumite surprize (mai ales la FROM), adica :

FROM mesaje
JOIN utilizatori AS ue ...
JOIN utilizatori AS ud ...

//later, de fapt nu stiu daca e chiar OK, probabil vrei OUTER JOIN (nu INNER), adica:
FROM mesaje
LEFT OUTER JOIN utilizatori AS ue ...
LEFT OUTER JOIN utilizatori AS ud ...

Ca sa vezi care-i diferenta, pune id_expeditor / destinatar = 0 sau un id ce nu (mai) exista in tabela utilizatori.
Sus  
johnutz



Data înscrierii: 20/Iul/2004
Mesaje: 956
Locație: Între scaun și tastatură

Trimis: Sâm Dec 02, 2006 5:58 pm    Titlul subiectului:  

Intr-adevar e mai bine cu AS, pt claritate.
Cat despre INNER vs OUTER, poate ar merita deschisa o noua discutie.
Cazul pe care l-am prezentat e doar pentru exemplificare, adevaratele tabele care m-au dus la problema asta fiind altele :wink:
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> Alte baze de date
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community