 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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 |
|
| |
|