MySQL - Tips und Tricks: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
Zeile 1: Zeile 1:
UPDATE mit Werten aus anderer Tabelle
+
== Wert mit Werten aus einer Komma separierten Liste vergleichen==
 +
 
 +
Gerade bei Typo3 hat man oft das Problem, das man eine id mit einem Datenbank Textfeld mit einer Liste von Werten die mit Komma getrennt vorliegen vergleichen will. Die Typo funktionen sind Performancefresser. Eleganter geht es mit einer geschickten MySQL Abfrage.
 +
Beispiel finde den Wert 7 in der Liste des Feldes usergroup (da steht z.B. 3,5,7,8,9 drin)
 +
 
 +
WHERE CONCAT(',',usergroup,',') LIKE '%,7,%'
 +
 
 +
oder:
 +
WHERE FIND_IN_SET('7',usergroup)>0
 +
== UPDATE mit Werten aus anderer Tabelle ==
 +
 
 +
 
 
aus: http://www.tutorials.de/forum/relationale-datenbanken-sql-mysql-oracle-db2-mssql/174881-mysql-update-mit-werten-aus-anderer-tabelle.html
 
aus: http://www.tutorials.de/forum/relationale-datenbanken-sql-mysql-oracle-db2-mssql/174881-mysql-update-mit-werten-aus-anderer-tabelle.html
  

Version vom 28. November 2008, 16:13 Uhr

Wert mit Werten aus einer Komma separierten Liste vergleichen

Gerade bei Typo3 hat man oft das Problem, das man eine id mit einem Datenbank Textfeld mit einer Liste von Werten die mit Komma getrennt vorliegen vergleichen will. Die Typo funktionen sind Performancefresser. Eleganter geht es mit einer geschickten MySQL Abfrage. Beispiel finde den Wert 7 in der Liste des Feldes usergroup (da steht z.B. 3,5,7,8,9 drin)

WHERE CONCAT(',',usergroup,',') LIKE '%,7,%' 

oder:

WHERE FIND_IN_SET('7',usergroup)>0 

UPDATE mit Werten aus anderer Tabelle

aus: http://www.tutorials.de/forum/relationale-datenbanken-sql-mysql-oracle-db2-mssql/174881-mysql-update-mit-werten-aus-anderer-tabelle.html

Datum des Zugriffs: 4.4.2008

zunächst mal: Updates über mehrere Tabellen sind grundsätzlich "tricky" (siehe dazu die MySQL-Doku, speziell die Kommentare).

Dann: Der Tabellen-Name "order" ist nicht sehr empfehlenswert, da der Interpreter diesen Namen gerne mit dem ORDER BY verwechselt, ergo muss der Tabellenname order immer als `order` geschrieben werden, sonst droht Syntax-Error.

Ein weiteres Problem ist die Gruppen-Funktion MIN() ohne GROUP BY.

So, jetzt 2 Lösungsvorschläge, einmal mit SubQuery (ab MySQL 4.1): Code:

UPDATE
 user AS u
LEFT JOIN
 (SELECT uid, MIN(datum) AS mindatum FROM `order` GROUP BY uid) AS o ON u.id = o.uid
SET
 u.createDate = o.mindatum

und einmal mit temporärer Tabelle (MySQL 4.0 und früher): Code:

DROP TABLE IF EXISTS tmp_order;

CREATE TEMPORARY TABLE tmp_order TYPE = HEAP
 SELECT uid, MIN(datum) AS mindatum FROM `order` GROUP BY uid;

UPDATE
 user
LEFT JOIN
 tmp_order ON user.id = tmp_order.uid
SET
 user.createDate = tmp_order.mindatum;

DROP TABLE IF EXISTS tmp_order;