Homepage von Marco Krings

Tipps & Tricks zu MySQL

FULL OUTER JOIN mit MySQL

MySql unterstützt kein FULL OUTER JOIN. Um dennoch so eine Abfrage zu erzeugen muss man einfach einen LEFT JOIN und einen RIGHT JOIN per UNION verbinden.

     SELECT t1.*
          , t2.*
       FROM tabelle1 AS t1
  LEFT JOIN tabelle2 AS t2
         ON t1.feld1 = t2.feld1
      UNION
     SELECT t1.*
          , t2.*
       FROM tabelle1 AS t1
 RIGHT JOIN tabelle2 AS t2
         ON t1.feld1 = t2.feld1

 

 

Wenn eine Tabelle doppelte Datensätze beinhaltet, werden diese durch die Verwendung von UNION nicht berücksichtigt, da hierbei doppelte Datensätze aus der Ergebnismenge gefiltert werden. Als Lösung bietet sich daher folgende Variante an, welche auch schneller ist, da abschließend aus der Ergebnismenge keine doppelten Datensätze gelöscht werden.

     SELECT t1.*
          , t2.*
       FROM tabelle1 AS t1
  LEFT JOIN tabelle2 AS t2
         ON t1.feld1 = t2.feld1
      UNION ALL
     SELECT t1.*
          , t2.*
       FROM tabelle1 AS t1
 RIGHT JOIN tabelle2 AS t2
         ON t1.feld1 = t2.feld1
      WHERE t1.feld1 IS NULL

Die Logik dieser Abfrage ist einfach, es werden in der RIGHT JOIN-Abfrage nur noch die Datensätze ohne Gegenpart der ersten Tabelle benötigt. Mittels UNION ALL werden doppelte Datensätze nicht gelöscht.

Datensatz bei Bedarf bearbeiten oder anlegen

Wenn nicht bekannt ist ob ein Datensatz bereits vorhanden ist und somit nur bearbeitet werden muss (UPDATE) oder neu angelegt werden muss (INSERT), hilft eine Erweiterung der INSERT-Anweisung weiter.
Wenn beim hinzufügen, ein doppelter Primärschlüssel (PRIMARY KEY) gefunden wird, wird der Datensatz mit diesem Primärschlüssel geändert und somit nicht neu angelegt.

               INSERT INTO tabelle
                         ( id
                         , feld_2
                         , feld_3
                ) VALUES ( 1
                         , 'wert'
                         , 'wert'
 ) ON DUPLICATE KEY UPDATE feld_2 = 'wert'
                         , feld_3 = 'wert'

 

Doppelte Datensätze löschen

Um innerhalb einer Tabelle doppelte Datensätze zu löschen oder zu finden, bedarf es nur einer SQL-Anweisung. Die Tabelle muss dafür jedoch eine Spalte (hier: id) mit eindeutigen nummerischen Wert haben und als Primärschlüssel (Primary Key) definiert sein.
 Zum Vergleichen werden alle Felder genutzt die identische Werte haben, Ausnahme ist hier auf jeden Fall der Primärschlüssel. Anhand des Primärschlüssels wird beim löschen nur der Datensatz mit dem niedrigsten Wert erhalten, alle anderen doppelten Datensätze werden eliminiert.
Wenn nur doppelte Datensätze ausgegeben werden sollen und nicht sofort gelöscht werden sollen, muss nur die SELECT-Anweisung ausgeführt werden.

DELETE t1 FROM tabelle1 t1
             , (SELECT COUNT(*) AS anzahl
                     , MIN(id)  AS id
                     , feld_1
                     , feld_2
                     , feld_3
                     , feld_n
                  FROM tabelle1
              GROUP BY feld_1
                     , feld_2
                     , feld_3
                     , feld_n
                HAVING anzahl > 1
               ) AS t2
         WHERE t1.feld_1  = t2.feld_1
           AND t1.feld_2  = t2.feld_2
           AND t1.feld_3  = t2.feld_3
           AND t1.feld_n  = t2.feld_n
           AND t1.id     != t2.id

 

INSERT mit Daten aus anderen Tabellen

INSERT INTO tabelle1
          ( feld1
          , feld2
          , feld3
          )
     SELECT feld_a
          , feld_b
          , feld_c
       FROM tabelle2
          , tabelle3
      WHERE tabelle2.feld_c = tabelle3.feld_c

 

phpMyAdmin konfigurieren

Eigenschaften eintragen und als config.inc.php im Hauptverzeichnis speichern:

$cfg['Servers'][1]['host']      = '';
$cfg['Servers'][1]['auth_type'] = 'cookie|config|http|signon';
$cfg['Servers'][1]['user']      = '';
$cfg['Servers'][1]['password']  = '';
$cfg['Servers'][1]['only_db']   = '';

 

Zeilenumbruch

Zeilenumbruch in MySQL: \r\n

Ersetzen mit SQL

UPDATE tabelle
   SET feld = REPLACE(feld, 'suchwort', 'ersetzedurch');

 

root-Benutzerkennwort ändern über die Kommandozeile

mysqladmin -u root password new_password

oder

mysql -u root -p
set password=password("neues passwort");

Copyright © Marco Krings 2001-2010, http://www.marcokrings.de