PDO MySQL Mer
SELECT med WHERE och ORDER
Förutsättningar
Vi har fortfarande följande testtabell, med kolumnerna:
Index nummer - idx - som ska vara ett heltal, som ska vara unikt och som
lämpligast räknas upp automatiskt så fort det läggs
till en ny post
Förnamn - fornamn - ska avar ett textfält på max 20 tecken
Efternamn - efternamn - ska avar ett textfält på max 30 tecken
Ålder - alder - som ska vara ett heltal
+-----------+--------------+------+------------+---------+-------------+
| Field | Type | Null | Key | Default | Extra | +-----------+--------------+------+------------+---------+-------------+ | idx | int(3) | NO |primärnyckel| NULL |autoincrement| | fornamn | varchar(20) | YES | | NULL | | | efternamn | varchar(30) | YES | | NULL | | | alder | int | YES | | NULL | | +-----------+--------------+------+------------+---------+-------------+
Som skapades med följande kod:
id int not null primary key auto_increment,
fornamn varchar(20),
efternamn varchar(30),
alder int
)";
Ett begränsat urval direkt från tabellen
$stmt = $dbconn->prepare($sql);
$data = array();
$stmt->execute($data);
// eller ännu bättre
$sql = "SELECT * FROM testtabell WHERE id = ? " ;
$stmt = $dbconn->prepare($sql);
$data = array($myLookingAfterId);
$stmt->execute($data);
Här kommer vi enbart få en rad från tabellen eftersom id-numret är unikt den här tabellen.
OBS! Observera det enkla likamed-tecknet vilket är korrekt syntax här i SQL-kommandot(OBS! EJ två likamed-tecken).
$stmt = $dbconn->prepare($sql);
$data = array();
$stmt -> execute($data);
$antalposter = $stmt -> rowCount();
Här kommer vi få alla poster(rader) från tabellen med ett visst namn.
Vi tar också reda på hur många.
Vi kan begränsa med fler urvalskriterier.
Ett sorterat urval direkt från tabellen
Här får vi alla rader sorterade i storleksordning efter id-numret i stigande ordning, vilket är default så vi behöver egentligen inte skriva ut ASC.
Här får vi alla rader sorterade i storleksordning efter efternamnt i stigande ordning.
Här får vi alla rader sorterade efter alder med högst värde först.
Och en kombo av fler sorteringskriterier där den första gäller i första hand och nästa i andra hand och så vidare.
Ett begränsat OCH sorterat urval direkt från tabellen
Här får vi alla rader med ett visst efternamn sorterade i ordning efter förnamnet.
SELECT med INNER JOIN
Hämta info från två eller flera tabeller samtidigt
Vi kopplar ihop två tabeller genom motsvarande fält. Vi kan skriva ut info från flera tabeller, vi styr vad vi vill skriva ut, vi kopplar ihop det fältet (de kolumnerna) som motsvarar varandra och vi kan till och med styra sorteringen genom en kolumn i den andra tabellen. Det är enbart de poster i tabellerna som har en koppling som kommer skrivas ut. I exemplet så är ett id använt i en tabell och värdet för motsvarande id finns i en annan tabell, vilket medför att alla poster har en koppling till den andra tabellen.
Här har vi två tabeller
mysqlGrunderOvn3Car med fälten id, regnr, color, owner, garage och mysqlGrunderOvn3Garage med fälten id, gname
mysqlGrunderOvn3Car.id,
mysqlGrunderOvn3Car.regnr,
mysqlGrunderOvn3Car.color,
mysqlGrunderOvn3Garage.gname,
mysqlGrunderOvn3Car.owner
FROM mysqlGrunderOvn3Car INNER JOIN mysqlGrunderOvn3Garage ON mysqlGrunderOvn3Car.garage=mysqlGrunderOvn3Garage.id
ORDER BY mysqlGrunderOvn3Garage.gname" ;
Hämta info från fler tabeller samtidigt och förkorta allt med alias
Vi gör på motsvarande sätt som ovan men blandra in flera tabeller. Det blir väldigt långt uttryck därför visar jag på hur man kan använda "alias" i just detta uttryck för att förkorta längden.
FROM mysqlGrunderOvn3Car AS c
INNER JOIN mysqlGrunderOvn3Garage AS g ON c.garage=g.id
INNER JOIN mysqlGrunderOvn3Owner AS o ON c.owner=o.id
ORDER BY g.gname ASC, o.oname ASC" ;
Om vi hade haft samma kolumnnamn i flera tabeller och velat skriva ut informationen i dessa så blir det konflikt då de ska hämtas med samma attribut-namn. T ex om både garage och owner tabellen har en kolumn som heter namn. Då skulle starten ovan se ut så här:
SELECT c.id, c.regnr, c.color, g.name, o.name FROM...
Detta löser vi med alias.