Newsgroup: it.comp.software.database
Titolo: relazioni tabelle

Salve sto cercando di utilizzare php accoppiato a
mysql
il mio problema e' che non riesco a relazionare 2 tabelle tra di loro con
mysql es:
table1
******
id_table1( PK auto_increment not null)
nome varcxhar(20)
cognome varchar(20)
indirizzo varchar(20)
lavori_svolti varchar(20)// qui specifico lavori tipo , realizzazione siti,
ecc//
table2
id_table2 (pk auto_inc. not null)
lavori_svolti    /* qua  non so kome dichiararlo per relazionare il tutto
qualkuno potrebbe riscrivere queste 2 tabelle con lņa relazione tra tabella1
e la tabella 2?
kome avrete kapito voglio mettere in rela<zione  lavori_svolti della prima
con lavori svolti della seconda..
Scusate se la domanda e' troppo idiota ma sono alle prime armi con mysql ed
ho anche provato a fare qualke prova ma nulla da fare...
Grazie a tutti.
Giax

Probabilmente finora hai usato Access in cui viene consigliato (pur
non essendo assolutamente necessario) di 'creare' le relazioni fra
tabelle, a livello intero Db, con uno strumento grafico.
Non serve che 'metti in relazione' le due tabelle.
Quando esegui un'istruzione SELECT (ad. esempio) basta che indichi
le condizioni (che ti definiscono la relazione).
Esempio:
SELECT tab1.campo1, tab1.campo2, tab1.campo3, tab2.campo1, tab2.campo2
FROM ta1, tab2
WHERE tab1.campo3 = tab2.campo.1;
In pratica:
mysql> show tables;
+-------------------+
| Tables in pippo   |
+-------------------+
| tab_autobus       |
| tab_clienti       |
| tab_lavori_svolti |
| tab_scuole        |
| tab_utenti        |
+-------------------+
5 rows in set (0.01 sec)
mysql> show columns from tab_clienti;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| cod_cliente     | int(11)      |      | PRI | 0       | auto_increment |
| ragione_sociale | varchar(64)  | YES  |     |         |                |
| indirizzo       | varchar(128) | YES  |     |         |                |
+-----------------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> show columns from tab_lavori_svolti;
+-------------+--------------+------+-----+------------+----------------+
| Field       | Type         | Null | Key | Default    | Extra          |
+-------------+--------------+------+-----+------------+----------------+
| cod_lavoro  | int(11)      |      | PRI | 0          | auto_increment |
| desc_lavoro | varchar(128) | YES  |     |            |                |
| data_lavoro | date         | YES  |     | 0000-00-00 |                |
| cod_cliente | int(8)       |      | MUL | 0          |                |
+-------------+--------------+------+-----+------------+----------------+
4 rows in set (0.00 sec)
mysql> select * from tab_clienti;
+-------------+-----------------+-------------------+
| cod_cliente | ragione_sociale | indirizzo         |
+-------------+-----------------+-------------------+
|           1 | aaa group       | via xxx, 5        |
|           2 | societ bbb      | via zzzz, 7       |
|           3 | pippo srl       | via esxcderfv, 12 |
+-------------+-----------------+-------------------+
3 rows in set (0.00 sec)
mysql> select * from tab_lavori_svolti;
+------------+-------------+-------------+-------------+
| cod_lavoro | desc_lavoro | data_lavoro | cod_cliente |
+------------+-------------+-------------+-------------+
|          1 | lavoro n.1  | 0000-00-00  |           1 |
|          2 | lavoro n.2  | 0000-00-00  |           1 |
|          3 | lavoro n.3  | 0000-00-00  |           3 |
|          4 | lavoro n.4  | 0000-00-00  |           1 |
|          5 | lavoro 5    | 0000-00-00  |           2 |
|          6 | lavoro n.6  | 0000-00-00  |           1 |
+------------+-------------+-------------+-------------+
6 rows in set (0.00 sec)
mysql> select a.ragione_sociale, b.cod_lavoro, b.desc_lavoro,
b.data_lavoro from tab_clienti as a, tab_lavori_svolti as b;
+-----------------+------------+-------------+-------------+
| ragione_sociale | cod_lavoro | desc_lavoro | data_lavoro |
+-----------------+------------+-------------+-------------+
| aaa group       |          1 | lavoro n.1  | 0000-00-00  |
| societ bbb      |          1 | lavoro n.1  | 0000-00-00  |
| pippo srl       |          1 | lavoro n.1  | 0000-00-00  |
| aaa group       |          2 | lavoro n.2  | 0000-00-00  |
| societ bbb      |          2 | lavoro n.2  | 0000-00-00  |
| pippo srl       |          2 | lavoro n.2  | 0000-00-00  |
| aaa group       |          3 | lavoro n.3  | 0000-00-00  |
| societ bbb      |          3 | lavoro n.3  | 0000-00-00  |
| pippo srl       |          3 | lavoro n.3  | 0000-00-00  |
| aaa group       |          4 | lavoro n.4  | 0000-00-00  |
| societ bbb      |          4 | lavoro n.4  | 0000-00-00  |
| pippo srl       |          4 | lavoro n.4  | 0000-00-00  |
| aaa group       |          5 | lavoro 5    | 0000-00-00  |
| societ bbb      |          5 | lavoro 5    | 0000-00-00  |
| pippo srl       |          5 | lavoro 5    | 0000-00-00  |
| aaa group       |          6 | lavoro n.6  | 0000-00-00  |
| societ bbb      |          6 | lavoro n.6  | 0000-00-00  |
| pippo srl       |          6 | lavoro n.6  | 0000-00-00  |
+-----------------+------------+-------------+-------------+
18 rows in set (0.01 sec)
mysql> select a.ragione_sociale, b.cod_lavoro, b.desc_lavoro,
b.data_lavoro from tab_clienti as a, tab_lavori_svolti as b
WHERE b.cod_cliente = a.cod_cliente ORDER BY a.ragione_sociale;
+-----------------+------------+-------------+-------------+
| ragione_sociale | cod_lavoro | desc_lavoro | data_lavoro |
+-----------------+------------+-------------+-------------+
| aaa group       |          1 | lavoro n.1  | 0000-00-00  |
| aaa group       |          2 | lavoro n.2  | 0000-00-00  |
| aaa group       |          4 | lavoro n.4  | 0000-00-00  |
| aaa group       |          6 | lavoro n.6  | 0000-00-00  |
| pippo srl       |          3 | lavoro n.3  | 0000-00-00  |
| societ bbb      |          5 | lavoro 5    | 0000-00-00  |
+-----------------+------------+-------------+-------------+
6 rows in set (0.01 sec)
mysql>
Come vedi, il primo select che interessa entrambe le tabelle ha
restituiti m x n record, in cui m rappresenta il numero di record
della tabella tab_clienti e m il numero di record della tabella
tab_lavori_eseguiti (3 x 6 = 18) eseguendo un'operazione che ricorda
(...) la moltiplicazione fra matrici.
La relazione fra le due tabelle la indichi con la clausula WHERE:
"WHERE b.cod_cliente = a.cod_cliente" in cui ricordo essere a e b
alias delle tabelle tab_clienti e tab_lavori_eseguiti rispettivamente
come definito in "from tab_clienti as a, tab_lavori_svolti as b".
Uno dei prioi commenti che sento quando la gente comincia ad
imbattersi in questi concetti e':"ma se viene creata una tabella
di m x n e poi ne prendo solo alcuni non e' che diventa lento ?".
Risposta: "Questo non e' un problema, i DBMS sono fatti apposta per
fare questo. :> " Per incrementare le prestazioni in presenza di
clausule e' necessario utilizzare gli indici ... e qui mi fermo.
Cmq se vuoi approfondire l'argomento ti consiglio di comperare
un manuale sull'SQL (cartaceo xche studiare sul monitor fa solo
venire mal di testa ... eppoi io studio seduto in bagno :> dove
il monitor non arriva) ... ne esiste uno di carino proprio su MySql:
"MySql e MSql" di O'Reilly se non sbaglio.
Bye ... sperando di esserti stato d'aiuto.


 Non serve che 'metti in relazione' le due tabelle.
beh...fare join e creare relazioni di integrità sono due cose differenti...
...a me pare che Giax desideri creare relazioni di integrità (posso anche
sbagliarmi eh...)
non conoscendo mysql (...e devo decidermi a farlo!)...delego la risposta a
chi ne sa più di me...
ciao e... scusate l'intromissione

...a me pare che Giax desideri creare relazioni di integrità
E' vero.
Purtroppo però (o per fortuna per chi è poco esperto come me!) MySQL non
gestisce l'integrità referenziale, non controlla se il dato inserito in una
chiave esterna esista o no nella tabella di riferimento, non aggiorna i
record correlati eccetera. Bisogna fare tutto "a mano".
Quindi MySQL si limita a consentire di creare più tabelle ed eseguire
queries SQL dichiarando i join tra le tabelle.
Quanto sia "relazionale" questo atteggiamento non saprei... ma il team di
sviluppo di MySQL, anche se se la comprende tra i TODO, non ha tra le prime
scadenze quella di implementare le relazioni tra tabelle. Quindi ci sarà da
aspettare un po'.
Comunque danno un po' di spiegazioni o suggerimenti nel cap. 5 della
documentazione.

 record correlati eccetera. Bisogna fare tutto "a mano".
io direi un bel PURTROPPO...
mysql è fantastico in termini di prestazioni e di affidabilità (ed è
gratis!) , ma a mio parere questa è una mancanza notevole...
ciao

C'e' sempre Interbase che penso gestisca anche queste cose ...
ed e' anche lui agratisse.


In TABLE2 devi inserire la chiave esterna ID_TABLE1.
Infatti in questo modo sai quali sono i lavori effettuati da una persona e
anche a quale persona appartiene un determinato lavoro.
Spero di averti detto ciň che volevi sapere.
Il Pioniere.

 ed e' anche lui agratisse.
OPPURE PostGreSQL, freeware e gestisce le relazioni ( e pure le
transazioni)