Link-uri de tabel în mysql

MySQL tabele conexiuni

Inițial, intenționam să fac lansarea "inițiativei oamenilor" cu o colecție de greșeli, admise mai ales de mine. Am colectat câteva articole despre greșelile tradiționale etc. Dar viața este mult mai interesantă! Scriu despre următoarea interpretare amatoră în legătură cu urmărirea hotărâtă.







Deci, un om, numiți-l Vasya, întreabă publicul forumului despre MySQL.

Q: Nu este foarte clar cum să creați o legătură între tabele, astfel încât al doilea câmp să fie introdus automat în câmpul primului (specific, selectiv și specific pe ID).

Opțiune Tip SELECT db.user, db.delete_priv, user.user, user.delete_priv DE LA dB, UNDE utilizator db.user = user.user nu într-adevăr adecvat ca de comunicare poate fi numit o intindere.

R: Sincer, nu înțeleg de ce această conexiune nu vă convine. Cum este tensionata aceasta relatie?

Î: Nu îmi place conexiunea bazată pe sintaxa de interogare. Aș dori ceva mai semnificativ, altfel nu văd nici un sens în chei și indici deloc.

O: Mai semnificativă - vrei să spui o interfață grafică ca în MS Access?

Din păcate, accesul în sine funcționează exact în același mod - apăsați butonul "SQL" și veți vedea aceste linkuri "cu mare întindere".

Î: Este mai ușor pentru mine să fac în mod programatic toate, beneficiul mesei este mic. Odată ce în MySQL nu funcționează.

O: Prin bucle imbricate, recurențe? Spune-mi de ce ai nevoie de o bază de date și de mese?

Q: Nu există cicluri imbricate și recurențe - Am citit cea de-a noua matrice de matrice și deja lucrez cu ei. Și pentru a face comunicarea pe baza unei selecte nu este exact ceea ce am nevoie.

R: Așa este. păstrați totul în fișiere, atunci nu vor mai exista deloc întrebări.

În general, consider că este datoria mea să așez tabelele pe rafturi.

Clauzele FOREIGN KEY, CHECK, and REFERENCES nu fac nimic. Sintaxa pentru ele este furnizată numai pentru compatibilitate, pentru a facilita codul de port de la alte servere SQL. Vezi secțiunea 5.4 Funcționalitatea lipsă din MySQL.







Comunicare fără întindere mare

În general, nu a existat nici o întindere în descrierea legăturilor din interogare și nu - de la începutul secolului, bazele de date au funcționat așa. Accesul cu săgeți și formatorii a apărut mult mai târziu.

Cum se face greșit

De exemplu, astfel:

Din interogare, numele titlurilor au fost obținute și scrise în matricea $ rub.

Acum se selectează știrile și, în locul numărului selectat al poziției, inserăm elementul corespunzător al matricei de titluri.

De fapt, vă puteți salva de la a fi nevoie să urechiușă prin întregul program de matrice $ freca (și, dacă trebuie să pozițiile funcție de cotitură - care preiau GLOBAL), posibilitatea de a face o greșeală cu $ freca [rândul $ [ „freca“]] - Dacă există mai multe astfel de solicitări pe pagină, este ușor să faceți o tipografie undeva.

În plus, matricea $ rub necesită o anumită cantitate de memorie (și dacă există mai multe categorii?). În cea de-a treia versiune de PHP, acest script va funcționa mai mult decât utilizarea rapoartelor de tabele, deoarece interpretează linia de program pe linie în execuție (spre deosebire de cea de-a 4-a, care compilează programul și apoi îl execută).

În exemplul de mai sus, puteți să aplicați tabelele de îmbinare și să eliminați deficiențele descrise.

Deci, aici este mai bine să utilizați interogarea „SELECT sites.id, URL-ul, sites.name ca numesite, rubs.name ca rubsname, rubs.id ca rub_id la site-uri, freacă UNDE sites.rub = rubs.id“. Se pare că avem o gamă gata, ne pasă de rezultatul numai a elementelor sale și scriem mai puțin cod.

Sintaxa de tabel se alătură

Conexiune simplă - JOIN INNER:

SELECT Din tabelul1 INNER JOIN table2 ON table1.field1 = table2.field

SELECT FROM table1, table2 WHERE table1.field1 = table2.field2

SELECT Din tabelul1 INNER JOIN table2 UTILIZAREA (câmpul 1)

dacă tabelele sunt combinate în câmpul de câmp1.

În această privință, sunt selectate numai acele rânduri de tabele care se potrivesc cu condiția de asociere - egalitatea valorilor câmpului. Dacă nu există un rând corespunzător din tabelul2 pentru tabelul de rând1, linia nu intră în rezultatul interogării. Dacă este necesar să numărați numărul de site-uri dintr-o categorie (am continua exemplul cu catalogul), o astfel de interogare nu se potrivește - doar titlurile în care există site-uri apar în listă. Pentru această operație, trebuie să utilizați ALIMENTAȚI STÂNGA.

SELECT Din tabelul1 TABELUL JOINȚEI PE TOTUL2 ON table1.field1 = table2.field2

SELECT Din tabelul1 TABELUL JOINȚEI ÎN STÂNGA2 UTILIZAREA (câmpul1)

dacă tabelele sunt combinate în câmpul de câmp1.

În acest caz, rândul corespunzător din tabelul 2 nu poate fi, atunci în câmpurile de la table2 obținem NULL și dacă este o operație de grup, ca în cazul numărului de site-uri din rubrică, atunci câmpul va fi 0:

SELECT rubs.id, nume, COUNT (sites.id) AS site-uri FROM FOARTE site-uri LEFT JOIN pe rubs.id = sites.rub GROUP BY rubs.id

Notă: câmpul ID este în ambele tabele, deci trebuie să utilizați numele tabelului în desemnarea lor. Apropo, dacă operațiile de grup nu sunt utilizate la fuziune, este mai bine să modificați numele câmpului de către operatorul AS, astfel încât să nu existe confuzie.







Trimiteți-le prietenilor: