Inițiativa Poporului
Inițiativa Poporului # 151; conexiune de masă la MySQL
Patru motive pentru care nu este necesar să se efectueze scrierea de cereri mari pentru formare lingvistică
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).
Tip Varivant 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ă la fel de bine # 151; trebuie doar să apăsați butonul „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 recursivitate # 151; Am citit matrice kolmchestvo n-lea și care lucrează cu ei deja. Și face legătura bazată pe Selecta # 151; 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 obținute din interogarea și stocată într-o matrice # 36; 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 al acestei matrice # 36; freca (și, dacă ne referim la funcția pozițiile - care preia GLOBAL?), Oportunitatea de a face o greșeală cu # 36; freca [# 36; rândul [ „freca“]] - în cazul în care pagina de mai multe cereri similare, face o greșeală de scriere undeva cu ușurință.
In plus, matricea # 36; 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.
> mese Joining teribil de lent
pentru asocierea rapidă a care se combină pentru a avea nevoie de câmpuri index. EXPLICAȚI SELECT prietenul tău credincios și tovarăș. Și puteți optimiza mai multe întrebări, citiți secțiunea de mana „5.2.6 Cum MySQL Optimizeaz STÂNGA și DREAPTA ÎNREGISTREAZĂ-TE“. Mai mult, poate, în cazul în care există alte criterii mai specifice de selecție UNDE - pentru a le pune în primul rând și apoi Reunire.
Nu voi crede niciodată că programatică pe client a face asocierea mai bună (efektivnosti) decât se va face în baza de date.