SQL Basis [1]

  • Ik zie hier op CP vaak hele slechte scripts met rampzalige MySQL databases erachter. Een groot deel van de load op de server wordt veroorzaakt door deze query's, en het leek mij dus handig hier wat meer informatie over te geven.


    Laten we even van een database uitgaan waarin de volgende gegevens staan:


    Tabel Gebruikers:


    - gebruiker_id
    - gebruiker_naam
    - gebruiker_password
    - gebruiker_rank


    Tabel Auto:


    - auto_id
    - auto_type
    - auto_schade
    - auto_eigenaar


    Hoe maak je dit in MySQL; Ik laat hier een paar extra commando's achterwege om het begrijpelijk te houden, misschien maak ik daar later nog een topic over.


    De create statements:



    LET OP: auto_eigenaar is een INTEGER (getal), we slaan expres NIET te gebruikersnaam op in Auto, aangezien het op deze manier sneller is en ook handiger: Als je immers een gebruikersnaam wilt wijzigen hoef je niet alle auto's van deze gebruiker up te daten. Voor de duidelijkheid: auto_eigenaar refereert dus naar gebruiker_id en niet naar gebruiker_naam.
    Normaal gezien zou je dus ook nog een tabel met auto types hebben en daar dus ook een foreign key naartoe. Natuurlijk zou je ook in PHP een SWITCH kunnen maken, maar als je later een auto wilt toevoegen of wijzigen is dit vele malen makkelijker: Je kunt deze optie nu zelfs in je Administrator/Moderator paneel zetten.


    Hoe maak je nou een lijst met auto's en de daarbijbehorende eigenaarsNAAM (en dus niet ID zoals in Tabel Auto staat)?


    Nou gewoon zo:


    PHP
    $query = mysql_query("
    SELECT a.auto_type,a.auto_schade,g.gebruiker_naam FROM Auto a 
    LEFT JOIN Gebruikers g
    ON a.auto_eigenaar = g.gebruiker_id
    ");


    Door middel van een WHILE kan je makkelijk een lijst van auto's weergeven in PHP:


    PHP
    while($show = mysql_fetch_assoc($query)){
    echo '
    Type:     '.$show['auto_type'].'<BR>
    Schade:   '.$show['auto_schade'].'<BR>
    Eigenaar: '.$show['gebruiker_naam'].'
    ';
    }
  • Guest, wil je besparen op je domeinnamen? (ad)
  • Ja, tables maken in PHPMyAdmin is niet aangeraden. Je kunt je keys geen namen geven, en geen CONSTRAINTS aanmaken (Zowel CHECK als FOREIGN KEY).


    Enkele verbeteringen:


    Je referentie is niet compleet. Om hem compleet te maken:


    Als je het definieert via een constraint kun je de constraint een naam meegeven. Dit is handiger met het verwijderen van constraints.


    En als ik vragen mag, waarom geef je alle veldnamen een prefix?


    En een tipje voor jouzelf:

    Citaat


    The display width does not constrain the range of values that can be stored in the column, nor the number of digits that are displayed for values having a width exceeding that specified for the column. For example, a column specified as SMALLINT(3) has the usual SMALLINT range of -32768 to 32767, and values outside the range allowed by three characters are displayed using more than three characters.


    When used in conjunction with the optional extension attribute ZEROFILL, the default padding of spaces is replaced with zeros. For example, for a column declared as INT(5) ZEROFILL, a value of 4 is retrieved as 00004. Note that if you store larger values than the display width in an integer column, you may experience problems when MySQL generates temporary tables for some complicated joins, because in these cases MySQL assumes that the data fits into the original column width.


    http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

  • Citaat van YVMdesign

    Ik maak een tabel in phpmyadmin, en voer dan alles in.
    Is dat zo erg dan?


    Bovenop wat Killingdevil zegt komt er ook nog bij kijken dat je er niks van leert.

  • Killingdevil goeie tips, verder vind ik het leuk van Jeroen dat hij probeert mensen te helpen.


    Dus vat de tips gewoon positief op en probeer er van te leren.

    School
    Tweedejaars Informatica Student @ Hogeschool Rotterdam.


    Webtalen
    - PHP ( OOP )
    - SQL
    - JavaScript i.c.m. jQuery framework
    - (x)HTML
    - CSS
    - Actionscript
    - XML


    Programmeertalen
    - Java
    - C#
    - Ruby i.c.m. on Rails framework

  • Ik ben voor iemand een nieuwsbrief systeem aan het maken.
    Maar ik heb momenteel egt extreem tijd de kort en ben nu 5 tegelijk probeeren te helpen maar het lukt me niet meer en ik word gek. !
    Nu zat deze sql erbij maar hier klopt niks van.
    Omdat dit over mysql gaat,Kan iemand hiervan een kloppende voor mij maken?
    Danku zeer alvast. :$



  • Zo moet die ongeveer kloppen.
    Kan altijd nog beter.


    Maar zorg er voor dat in die m_activeren een emailId komt van het account waar de email in staat.

    School
    Tweedejaars Informatica Student @ Hogeschool Rotterdam.


    Webtalen
    - PHP ( OOP )
    - SQL
    - JavaScript i.c.m. jQuery framework
    - (x)HTML
    - CSS
    - Actionscript
    - XML


    Programmeertalen
    - Java
    - C#
    - Ruby i.c.m. on Rails framework

  • ik krijg nu deze error

    PHP
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'KEY (email) ) CREATE TABLE m_admin ( id INT (11) NOT NULL auto_increment,' at line 4
  • Spatie weghalen na id.


    KillingDevil, "ON CASCADE" is uiteraard een leuke functie, maar in praktijk zal je nooit een gebruiker_id willen veranderen, omdat er dan gaten in je tabel komen (auto_increment). Lijkt me eigenlijk wat overbodig lastig voor de meesten hier :)


    Prefixes zijn omdat er nogal eens dezelfde veldnamen in meerdere tabellen voorkomen, en ik dit zelf overzichtelijker vind.

  • Wanneer je niet aangeeft wat je met de relatie wilt, waarom zou je hem dan nog aanmaken? Aangeven wat je wilt, SET NULL, CASCADE, of NO ACTION / RESTRICT maakt het duidelijker en functioneler (Kun je eigenlijk wel zonder acties een referentie aanmaken?).


    En een gebruiker ID kan maar zo om een of andere vage reden gewijzigd worden, zoals ik op CP ook heb meegemaakt (Of niet Darsstar?:P) Daarbij is de ON DELETE actie wel zeer nuttig.


    En "ON CASCADE"? Klopt niet echt in syntax hé.;)

  • Inderdaad...
    Ik had liever dat iemand (Koen) dat ene script had gewijzigd dan dat mijn id veranderd moest worden om van die leuke errors af te komen nadat de database gegevens gewijzigd waren...


    Volgens mij is NO ACTION de standaard actie (bij mysql), en kan je dus referenties aanmaken zonder acties.
    Ook kan je constraints wel via phpmyadmin aanmaken, al is het minder fijn.

  • Misschien dat ik nog een wat uitgebreidere uitleg maak binnenkort. o.a. Having, Subqueries, Normalisatie kan ik nog wel wat over vertellen, misschien dat KillingDevil dan ook even wil helpen.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!