 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| Subiectul anterior :: Subiectul următor |
| Autor |
Mesaj |
wild warrior
Data înscrierii: 21/Aug/2008
Mesaje: 7
|
| Trimis: Joi Aug 21, 2008 8:37 am Titlul subiectului: selectie multipla |
|
|
sal,
am urmatorul caz:
- am trei tabele clienti, contracte si modificari contracte dupa cum urmeaza:
tb01 = contracte_mod AS cm (tabelul de modificari contracte)
fields: cm.id, cm.date, cm.new_id, cm.old_id
unde
cm.id = c.id
cm.new_id = cl.id (nou) si cm.old_id = cl.id (vechi)
tb02 = contracte AS c (tabelul de contracte)
fields: c.id, c.name, c.id_cl
unde
c.id_cl = cl.id
tb03 = clienti AS cl (tabelul de clienti)
fields: cl.id, cl.name
- dupa cum se vede, in tb01 apar doua coloane de id-uri preluate din tb03 (clienti)
INTREBARE
care este sql-ul astfel incat sa afisez intr-un tabel asemanator cu tb01 dar cu coloanele: c.name, cm.date, c.new_name, c.old_name, c.new_name fiind c.name corespondent lui cm.new_id si c.old_name corespondent lui cm.old_id ?
datele trebuiesc preluate in ordinea tb01 <- tb02 <- tb03 avand in vedere ca npul tabel afisat este raportat la contracte
multumesc anticipat
PS
daca nu se intelege ceva, va rog sa-mi cereti info suplimentare |
|
| Sus |
|
ShD
Data înscrierii: 19/Noi/2007
Mesaje: 119
Locație: Iasi
|
| Trimis: Dum Aug 24, 2008 12:18 pm Titlul subiectului: |
|
|
poti incerca ceva de genul dar extins. daca nu reusesti revina cu un raspuns sa iti postez tot queryul ca acum is on the run.
Cod: SEECT cm.stuff, c.otherstuff from contracte_mod cm LEFT JOIN contracte c ON cm.id = c.id |
|
| Sus |
|
wild warrior
Data înscrierii: 21/Aug/2008
Mesaje: 7
|
| Trimis: Dum Aug 24, 2008 7:45 pm Titlul subiectului: |
|
|
multumesc pt raspuns dar nu este suficient
eu am facut asa:
Cod:
SELECT * FROM ((cm LEFT JOIN c ON cm.id = c.id) LEFT JOIN cl ON c.id = cl.id) ORDER BY cl.id ASC
problema este ca nu stiu cum sa-mi apara cl.name corespondent lui cm.new_id si cl.name corespondent lui cm.old_id avand in vedere ca trebuie sa se treca cu cautarea de doua ori prin tabelul cl si sa se afiseze cate un nume la fiecare id (cm.new_name = cu un cl.id si in acelasi tabel, cm.old_name = cu un alt cl.id) deoarece contractele au trecut de la un client la altul fiecare cu id-ul si numele diferit, aceste id-uri si nume fiind preluate din tableul cl |
|
| Sus |
|
mihaitha
Data înscrierii: 04/Mai/2007
Mesaje: 1801
Locație: Sibiu
|
| Trimis: Lun Aug 25, 2008 9:04 am Titlul subiectului: |
|
|
in primul rand (mai ales cand lucrezi impreuna cu altii la o problema), renunta la alias-urile alea cu cl, cm si c. E mai usor pentru noi sa intelegem la ce tabela te referi, deci in continuare voi folosi numele de tabela complet.
Acum, query-ul tau se face asa: Cod:
SELECT
contracte_mod.id,
contracte_mod.date,
clienti_old.name AS old_name,
clienti_new AS new_name
FROM contracte_mod
LEFT JOIN (contracte AS contracte_old
INNER JOIN clienti AS clienti_old
ON contracte_old.id_cl = clienti_old.id
)
ON contracte_mod.old_id = contracte_old.id
LEFT JOIN (contracte AS contracte_new
INNER JOIN clienti AS clienti_new
ON contracte_new.id_cl = clienti_new.id
)
ON contracte_mod.new_id = contracte_new.id
Practici faci doua LEFT JOIN-uri pe aceeasi tabela (care e de fapt un INNER JOIN intre contracte si clienti), insa pentru a le diferentia folosesti alias-uri pe tabela (tabela AS alias).
Nu l-am testat, dar teoretic ar trebui sa mearga. |
|
| Sus |
|
wild warrior
Data înscrierii: 21/Aug/2008
Mesaje: 7
|
| Trimis: Mie Aug 27, 2008 9:47 am Titlul subiectului: |
|
|
ca urmare a observatiei corecte a lui mihaitha, voi repeta conditiile, mai ales ca in ultimul raspuns primit nu apare o coloana de care am nevoie (contract_name)
===============================================
contracte_mod
| contract_id | contract_date | new_client_id | old_client_id |
(nu exista key, avand in vedere ca in acest tabel pot apare aceleasi contracte_id de mai multe ori schimbandu-si clientul)
-------------------------------------------------------------------------------------
contracte
| contract_id | contract_name | client_id |
key = contract_id
-------------------------------------------------------------------------------------
clienti
| client_id | client_name |
key = client_id
-------------------------------------------------------------------------------------
RELATII INTRE TABELE
contracte_mod.contract_id = contracte.contract_id
contracte.client_id = clienti.client_id
===============================================
REZULATUL DORIT
tabel
| contract_id | contract_date | contract_name | new_client_name | old_client_name |
===============================================
- problema mea nu este cu afisarea primelor doua coloane
"SELECT
contracte_mod.contracte_id, contracte_mod.contract_date,
contracte.contract_id, contracte.contract_name
FROM contracte_mod LEFT JOIN contracte
ON contracte_mod.contract_id = contracte.contract_id
ORDER BY contracte_id ASC"
rezultand
tabel
| contract_id | contract_date | contract_name |
- problema mea este ca in continuarea acestui tabel, in alte doua coloane, trebuie sa afisez new_client_name si old_client_name aferente new_client_id si old_client_id
multumesc pentru raspunsuri, astept unul care sa ma ajute |
|
| Sus |
|
wild warrior
Data înscrierii: 21/Aug/2008
Mesaje: 7
|
| Trimis: Dum Aug 31, 2008 8:02 pm Titlul subiectului: |
|
|
am primit o rezolvare pe care o afisez aici fiind poate de folos si altcuiva
Cod:
SELECT a.contract_id,a.contract_date,b.contract_name,
(SELECT c.client_name FROM clienti c WHERE c.client_id=a.new_client_id)
client_nou,
(SELECT c.client_name FROM clienti c WHERE c.client_id=a.old_client_id)
client_vechi
FROM contracte_mod a, contracte b WHERE a.contract_id=b.contract_id
ORDER BY a.contract_id,a.contract_date;
|
|
| 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 |
|
| |
|