SQL Anwendungsfälle
SQL Auswahlselektierung
Nur Galerien, die auch Bilder beinhalten
SELECT
g.*,
u.username
FROM fe_users u,
tx_nfccommunitygallery_gallery g
LEFT JOIN tx_nfccommunitygallery_images i
ON g.uid = i.gallery_id
WHERE
g.hidden = 0 AND
g.deleted = 0 AND
g.user_id = u.uid AND
g.uid IN
(
SELECT tx_nfccommunitygallery_images.gallery_id
FROM tx_nfccommunitygallery_images
WHERE tx_nfccommunitygallery_images.gallery_id = g.uid
AND tx_nfccommunitygallery_images.deleted = 0
)
GROUP BY
g.uid
ORDER BY
g.crdate DESC
LIMIT
0, 10
Nur Zeitspannen, die innerhalb einer eingegebenen Zeitspanne liegen
In der Datenbank liegen Zeitspannen (from, to) und der Nutzer kann eine Zeitspanne (from, to) eingeben. Es werden nur diese Daten ausgegeben. Zusätzlich wird durch trip_to >= UNIX_TIMESTAMP(now()) noch hervorgerufen, dass nur Daten, die in der Zukunft liegen ausgegeben werden:
SELECT
...
FROM
...
WHERE
...
AND
(
tx_nfcbiketours_trip_bookable.trip_from <= "'.gmmktime(0,0,0,intval($dateFrom_exploded[1]),intval($dateFrom_exploded[0]),intval($dateFrom_exploded[2])).'"
)
OR
(
trip_from BETWEEN UNIX_TIMESTAMP("'.$dateFrom_exploded[2].'-'.$dateFrom_exploded[1].'-'.$dateFrom_exploded[0].'") AND UNIX_TIMESTAMP("'.$dateTo_exploded[2].'-'.$dateTo_exploded[1].'-'.$dateTo_exploded[0].'")
OR
trip_to BETWEEN UNIX_TIMESTAMP("'.$dateFrom_exploded[2].'-'.$dateFrom_exploded[1].'-'.$dateFrom_exploded[0].'") AND UNIX_TIMESTAMP("'.$dateTo_exploded[2].'-'.$dateTo_exploded[1].'-'.$dateTo_exploded[0].'")
OR
UNIX_TIMESTAMP("'.$dateFrom_exploded[2].'-'.$dateFrom_exploded[1].'-'.$dateFrom_exploded[0].'") BETWEEN trip_from AND trip_to
OR
UNIX_TIMESTAMP("'.$dateTo_exploded[2].'-'.$dateTo_exploded[1].'-'.$dateTo_exploded[0].'") BETWEEN trip_from AND trip_to
)
AND
(
trip_to >= UNIX_TIMESTAMP(now())
)
Navigationslösung mit SQL_CALC_FOUND_ROWS
Navigationslösung
1. Abfrage mit SQL_CALC_FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS ID,name,kategorie
FROM tabelle INNER JOIN kategorien ON tabelle.kategorien_ID=kategorien.ID
WHERE spalte1 IN (SELECT ID FROM andereTabelle WHERE email!=""
ORDER BY zeit DESC LIMIT 15,20
2. Abfrage der Ergebnisse mit FOUND_ROWS() - liefert die gesamte Anzahl der Ergebnisse ohne Limit
SELECT FOUND_ROWS()
TYPO3 Beispiel
protected function getMyRecords() {
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($ar_select['select_fields'],$ar_select['from_table'],$ar_select['where_clause'],$ar_select['groupBy'],$ar_select['orderBy'],$ar_select['limit']);
$arr_res = array();
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
$arr_res[] = $row;
}
$resCount = getNumberOfResultsForSQL_CALC_FOUND_ROWSStatements();
return array('records' => $arr_res, 'count' => $resCount);
}
protected function getNumberOfResultsForSQL_CALC_FOUND_ROWSStatements() {
$res = $GLOBALS['TYPO3_DB']->sql_query('SELECT FOUND_ROWS() AS count_rows');
$row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
return $row['count_rows'];
}
Wiki-Datei des Artikels herunterladen