Brugen af DISTINCT til at fjerne doblet row

For at fjerne en række der gentager sig når du nu trækker et udtræk ud så alle dine udtræk er unikke kan du gøre det ved at bruge DISTINCT efter SELECT og før du printer outputtet til browseren.

SELECT DISTINCT last_name FROM t;

Der er forskel på hvordan den fjerne disse gentaglser alt efter om du bruger binær eller ikke binær felter, hvis du bruger binær er ”ABC, Abc og abc” forskellige til hvis du bruger ikke binær felter.

Ved brugen af DISTINCT kan du benytte multi select til at ude lukke en støre sansynlighed for en dublikering.

SELECT DISTINCT last_name, first_name FROM t;

DISTINCT er god til små mængte data men skal man op og benytte nogle forskellige ting som at udelukke 2 e-mail adresser men stadig have brugers navn og adresse med ud kan DSTINCT ikke benyttes, til dette formål ville det være en bædre løsning hvis der bliver benyttet GROUP BY statment.

SELECT navn, adresse, email FROM table GROUP BY email;

På denne måde samler man alle emails samme i en gruppe hvor efter man kan trække adresse og navn med ud som en multi select.

Den største forskel mellem DISTINCT og GROUP BY er at DISTINCT ikke kan sorters men det kan GROUP BY godt, der i mod kan DISTINCT tælle sammen hvor mange lighedere der er mellem sin egen række som eks. Sådan her.

SELECT COUNT( DISTINCT j ) FROM t;

Apache og mod_rewrite

For at få mod_rewrite på en Apache 2+ til at funger er der en lille liste der skal udføres før man benytter dette, har selv slåset med det en lille stykke tid til det slog mig at det nok var nogle retihedere der skulle ændres jeg har ændre disse 2 retiheder i .conf filen under <Directory “C:/Apache2.2/htdocs”> og <Directory /> efter dette restaer jeg min webserver og nu funger det hele.

LoadModule rewrite_module modules/mod_rewrite.so
AllowOverride FileInfo Options -eller-
AllowOverride All
Options +FollowSymLinks -eller-
Options +SymLinksIfOwnerMatch -eller-
Options All

Prøv nu at lave en .htaccess med følge indhold

RewriteEngine on
RewriteRule ^MappeNavn/?$     demoSide.php

huske at “demoSide.php” skal være oprettet inden du tester siden.

Limit af en select

MySQL understøtter LIMIT inde i en SELECT, det  gør at du kan fortælle MySQL hvor meget der må kommer med ud af et row.

LIMIT kan inde holde 1 eller 2 værdier.

LIMIT row_count
LIMIT skip_count, row_count

Hver værdig skal være en int ( heltal ) og ikke en variable ( string ) værdi.

Når du indtastter et tal tager den row nummer 1 fra din table og retuerene så X antal rækker som du har bedt om

SELECT * FROM Country LIMIT 10;

Hvis du gerne vil have vil have fra nummer 20 og de nsæste 10 udtrukket vil det se sådan her ud.

SELECT * FROM Country LIMTI 20, 10;

Det er tit en fordel at benytte ORDRE BY funktionen til at udskefeisere dine udvalg nået mere så de også bliver mere presise.

SELECT * FROM Country ORDER BY Id DESC LIMIT 1;

Eks. Når der skal laves et søge felt med flere sider på kan og vil en SQL tit se ud i stil med denne

SELECT * FROM t ORDER BY Id DESC LIMTI 0, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 20, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 40, 20;
SELECT * FROM t ORDER BY Id DESC LIMTI 60, 20;
…..

Du skal huske selv om du bruger LIMIT og har 1.000.000 rækker i MySQL og vil have fat i de 10 sidste skal den løbe hele databasen igennem for at få de sidste 10, derfor er det en god ide at benytte WHERE statement for at reducere databasens udtræk.

Spekfikser et row select

Hvis man vil spefiksere nået data fra databasen når man har meget data man ikke behøves at liste ud altid men kun nået af dataen skal listes ud så kan man benytte en WHERE statement til at fortælle MySQL hvad for nået data der skal trækkes ud til brugeren, eks. hvis man har en land database hvor man updater hvornår man sidst har fået infomartion fra landet og det skal så kun være de lande som man har fået data fra efter 2006.

SELECT * FROM Country WHERE UpdateYear > 2006;

En mere complex WHERE udtræk kan hvor vi kun vil have de udtræk hvor der er flere indbygger end 1 mil. og mindre end 5 mil. vil en normal SQL se såda ud.

SELECT * FROM Country WHERE Indbygger >= 1000000 AND Indbygger <= 5000000;

Isted for at benytte så lang en SQL kan du bruge BETWEEN i MySQL til at udtrække 2 værdiere mellem hianden den ser sådan ud.

SELECT * FROM Country WHERE Indbygger BETWEEN 1000000 AND 5000000;

Det er nogle værdier i en SELECT statement der er stræker end andre eks. AND er stærker end OR i en SELECT.

WHERE GNP < 1000 AND Continent = ‘Africa’ OR Continent = ‘Asia’;

Denne SQL vil udtrække alle Continent fra Africa hvor GNP er mindre end 1000 og alle fra Continent fra Asia, for at få det mere udspefikerst og lave syntaxen rigtig vil din kode komme til at se sådan ud.

WHERE ( GNP < 1000 AND Continent = ‘Africa’ ) OR Continent = ‘Asia’;

Hvis du nu sider og tænker på du gerne vil have alle hvor GNP er mindre end 1000 og Continent er enten Africa eller Asia på samme tid, så skal du blodt andre lidt i din SQL så den kommer til at se sådan her ud.

WHERE GNP < 1000 AND ( Continent = ‘Africa’ OR Continent = ‘Asia’ );

Navngive colum i en select

Som standart er en colum ( række ) det samme navn som der står i database men dette kan ændres ved at benytte AS statement.

SELECT felt AS feltnavn FROM t;

du kan bruge det nye navn til at referer i GROUP BY, HAVING eller ORDER BY statement.

PDO::FETCH_OBJ – Select som object med PDO

Efter håden som jeg bruger PDO hver enste dag finder man jo ud af nogle nye veje at gå og på den måde også en mere smart måde og nemere måde at kode sin kode på.

Når du laver et udtræk ( select ) fra PDO får man det som regl i et array og alt efter om man bruger fetch() eller fetchAll() får man et støre array med $row[0][felt] for at undgå dette kan du benytte en funktion til fetch() og fetchAll() som heder PDO::FETCH_OBJ den laver dit array om til objecter på den måde er det meget nemere at holde styr på ens kode da det lige pluslig gir meget mere mening og du ikke kommer til at overskrive nået i dit array med en tilfædlig variable et andet sted i koden.

$resCountryEdit = $this->dbc->prepare( “SELECT * FROM country LIMIT 1″ );
$resCountryEdit->execute();
$rowCountryEdit = $resCountryEdit->fetch( PDO::FETCH_OBJ );

echo $rowCountryEdit->countryName;

Drop indexes

For at slette et index man har lavet i MySQL kan man benytte ALTER TABLE  eller DROP INDEX.

Ved at bruge ALTER TABLE skal der bruges DROP funktionen og det navn på det index der skal slettes, slette en PRIMARY KEY er meget simplet.

ALTER TABLE kontakt_personer DROP PRIMARY KEY;

for at droppe andre index må man spefikere det navn som skal slettes fra indexet, hvis du ikke kender navnet kan du bruge SHOW CREATE TABLE og får en liste over table struktueren og der ved finde alle de index du har til denne table.

Navnet på det valgte index kunne være NameIndex og for at slette dette index kan du udføre føglene.

ALTER TABLE kontakt_personer DROP INDEX NameIndex;

efter du har slettet dette index kan du oprette det igen ved at skrive

ALTER TABLE kontakt_personer ADD INDEX NameIndex( LastName , FirstName );

Når du slettere et index kan du ikke fortryde det så sikkere dig at du har taget en backup af din database inden du bevæger dig ud i at slette disse index.

Hvis du vælger at bruge DROP INDEX kan det gøres på denne måde

DROP INDEX NameIndex ON t;

For at slette en PRIMARY KEY skal du blot skrive

DROP INDEX PRIMARY KEY ON t;

Tilføj indexes til nuværdene table

MySQLHvis der skal tilføjes et index til en table kan du benytte ALTER TABLE eller CREATE INDEX af disse 2 satements er det ALTER TABLE der er mest flexible.For at tilføje et index til en table skal du skrive ADD foran dit statement, eks. hvis vi har en table der hedder kontakt_personer med følge felter.

CREATE TABLE kontakt_personer
(
Id INT NOT NULL,
LastName CHAR(30) NOT NULL,
FirstName CHAR(30) NOT NULL,
Email CHAR(200) NOT NULL
);

for at skabe en PRIMARY KEY på feltet Id og kombinere felterene LastName og FirstName som index skal jeg udføre følge statements. ALTER TABLE kontakt_personer ADD PRIMARY KEY (Id);
ALTER TABLE kontakt_personer ADD INDEX ( LastName , FirstName );

For et perfome MySQL bædre kan du kobinere disse 2 statement sådan du kun skal lave et kald til MySQL du kan se følge statements her.

ALTER TABLE kontakt_personer ADD PRIMARY KEY( Id ), AD INDEX ( LastName , FirstName );

Syntaxen for CRREATE INDEX er følgene hvor en statements oprettes enkle rækker

CREATE UNIQUE INDEX IdIndex ON kontakt_personer ( Id );
CREATE INDEX NameIndex ON kontakt_personer ( LastName , FirstName );

Ved brug af CREATE INDEX er det nød vendigt at skrive et navn hvor imod hvis du benytter ALTER TABLE udfylder MySQL indexet med et navn.

CREATE INDEX kan kun oprette en række pr statement og ikke flere af gangen lige som ALTER TABLE kan gøre, derfor er ALTER TABLE mere flexible at benytte.

PHP 5.2.5 RC1

PHP logo Det er muligt at hente PHP 5.2.5 RC 1 men jeg vil anbefalde man venter ind til den stable udgave kommer med mindre man skal bruge dette til udvikling kan denne version godt gå an.

Det er nu snart 1½ måndet siden de sidst udgav en stable version lad os se om de ikke får sat mere skub under føderne når nu der ikke bliver udviklet mere på PHP 4, jeg kryssere finger for dette.

Link: http://php.net