conexiune de masă la MySQL
Inițial am intenționat să fac eliberarea „inițiativei Poporului“, cu o colecție de erori comise în principal de mine :). Ceva ce am colectat din greșelile elementelor tradiționale, etc. Dar viața este mult mai interesant! Am scrie despre o altă inițiativă, în mod direct, fără întârziere.
Deci, unii oameni îl numesc Vasya întreabă forum public despre MySQL.
Î:. Nu este clar modul de a crea o relație între tabele, astfel încât primul câmp este automat introduce date la al doilea (ECHO și ECHO selectiv prin ID-ul).
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.
O:. Sincer, nu înțeleg de ce această relație nu ți se potrivește? Cum această relație este întinsă?
Î:. Ei bine, nu-mi place conexiunea, bazată pe sintaxa interogare de căutare. Aș dori ceva mai substanțial, altfel nu văd rostul în cheile și indexurile.
O:. O mai substanțială - adică interfața grafică în MS Access?
Din păcate, accesul funcționează în același mod - trebuie doar să apăsați un buton „SQL“, și veți vedea legătura, „o întindere“.
Î:. Am doar simplu software-ul pentru toate, masa puțin bine fac. Odată ajuns în MySQL care nu funcționează.
O:. O bucle imbricate, recurențe? Spune-mi de ce ai făcut-o bază de date și tabele?
Î:. Nu există bucle imbricate și recursie - citește matrice kolmchestvo n-lea și care lucrează cu ei deja. Și face conexiunea bazată pe Selecta - nu exact ceea ce am nevoie.
O:. Așa e. Salvați toate într-un fișier, atunci toate întrebările nu vor.
În general, este de datoria mea de a sorta prin conexiunea tabele.
FOREIGN KEY, CHECK, și clauzele REFERINȚE nu fac de fapt nimic. Sintaxa pentru ele este prevăzută numai pentru compatibilitate, pentru a face mai ușor de cod de port de la alte servere SQL și pentru a rula aplicații care creează tabele cu referințe. A se vedea secțiunea 5.4 Funcționalitate lipsă de la MySQL.
Comunicare fără întindere
În general, nu există nici o exagerare în a descrie relațiile în cerere nu a fost, nu - timp de secole baza de date a lucrat în acest fel. Accesul cu săgeți și formopostroitelyami au apărut mult mai târziu.
Cum greșit
De exemplu, ca aceasta:
numele coloanelor într-o interogare și stocate într-o matrice $ freca.
Acum, selectați știri, și coloana numărul selectat în schimb se introduce elementul corespunzător al coloanelor matrice.
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“]] - în cazul în care pagina de mai multe cereri similare, face o greșeală de scriere undeva cu ușurință.
În plus, matrice $ freca necesită o anumită cantitate de memorie (ca și în cazul în care mai multe coloane?). a treia versiune a PHP un script durează mai mult decât folosind tabelul de asociere, pentru că el interpretează linia de program, atunci când (spre deosebire de al 4-lea, care compilează programul și apoi execută).
În exemplul de mai sus se poate aplica masa de asociere și de a scăpa de dezavantajele 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ă trebuie să ne pregătim masele, grija pentru retragerea doar elementele și să scrie mai puțin cod.
Sintaxa pentru aderarea la tabele
Conexiune simplă - INNER JOIN:
SELECT
SELECT
SELECT
în cazul în care mesele sunt unite pe teren field1.
Acest compus selectat linie numai acele tabele care se potrivesc cu condiția alătura - egalitatea valorilor de câmp. Dacă nu există nici o linie de rânduri Tabelul 1 corespunzătoare Table2, linia trece aproape de rezultatul interogării. Dacă este necesar, pentru a contoriza numărul de site-uri din categoria (în continuare exemplul catalogului), o astfel de cerere nu se potrivesc destul de - numai coloanele apar în listă, care are site-uri. Pentru o astfel de operațiune este necesară pentru a utiliza LEFT JOIN.
SELECT
SELECT
în cazul în care mesele sunt unite pe teren field1.
În acest caz, rândul corespunzător din Table2 nu poate fi, apoi, în domeniul Table2 vom obține o NULL, iar în cazul în care operațiunea de grup, așa cum este cazul cu numărul de site-uri din categoria, în timp ce în domeniu va fi 0:
SELECT rubs.id, numele, COUNT (sites.id) AS siteurilor din frecări LĂSAT ÎNREGISTREAZĂ site-uri pe rubs.id = sites.rub GROUP BY rubs.id
Notă: ID-ul are în ambele tabele, astfel încât trebuie să utilizați un nume de tabel în denumirea lor. Prin modul în care, în cazul în care Uniunea nu utilizează operațiuni de lot, este mai bine pentru a schimba numele câmpului ca operator, pentru a evita confuzia.