Datakurser
Aktuell vecka: 48

Tillbaka till toppen

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:

$sql = "CREATE TABLE testtabell(
id int not null primary key auto_increment,
fornamn varchar(20),
efternamn varchar(30),
alder int
)"
;

Ett begränsat urval direkt från tabellen

$sql = "SELECT * FROM testtabell WHERE id='$myLookingAfterId' " ;
$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).

$sql = "SELECT * FROM testtabell WHERE name='$myLookingAfterName' " ;
$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.

$sql = "SELECT * FROM testtabell WHERE name='$myLookingAfterName' AND password='$myLookingAfterPassword' " ;

Vi kan begränsa med fler urvalskriterier.

Ett sorterat urval direkt från tabellen

$sql = "SELECT * FROM testtabell ORDER BY id ASC " ;

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.

$sql = "SELECT * FROM testtabell ORDER BY efternamn ASC " ;

Här får vi alla rader sorterade i storleksordning efter efternamnt i stigande ordning.

$sql = "SELECT * FROM testtabell ORDER BY alder DESC " ;

Här får vi alla rader sorterade efter alder med högst värde först.

$sql = "SELECT * FROM testtabell ORDER BY efternamn ASC, fornamn ASC, alder DESC " ;

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

$sql = "SELECT * FROM testtabell WHERE efternamn='$myLookingAfterName' ORDER BY fornamn ASC " ;

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

$query = "SELECT
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.

$query = "SELECT c.id, c.regnr, c.color, g.gname, o.oname
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.

$query = "SELECT c.id, c.regnr, c.color, g.name AS gar, o.name AS own 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.name ASC, o.name ASC" ;

Källor, referenser, bra länkar

Wikipedia: PHP
w3schools.com/php/

Utvecklingsmiljöer

Labbservern

PHP 7.2, MariaDB 5.5 och Apache 2.4.6

Laragon

Apache 2.4, MySQL 5.7, PHP 7.4

Lösningsförslag

Alrik's