Skip to content

Instantly share code, notes, and snippets.

@joergpatz
Last active August 29, 2015 14:00
Show Gist options
  • Save joergpatz/a12bbbd7a8248e1c268e to your computer and use it in GitHub Desktop.
Save joergpatz/a12bbbd7a8248e1c268e to your computer and use it in GitHub Desktop.
mysql code snippets

use the average aggregate function of a count query:

SELECT AVG (sender_count)
FROM (
  SELECT COUNT(sender_mail) AS sender_count
  FROM event
) AS event

Diese Funktion erfordert zwei oder mehrere Ausdrücke und liefert das erstes Argument zurück, welches von NULL verschieden ist. Ansonsten wird NULL zurückgegeben.

CoalEsce(Personen.Nachname + ', ' + Personen.Vorname, Personen.Nachname)

Die Tabelle Personen mag zwei Spalten Nachname und Vorname haben, Nachname ist ein Pflichtfeld, Vorname ist optional. Es soll, falls möglich, Nachname + Komma + Vorname ausgegeben werden. Verknüpft man die beiden Felder direkt und ist ein Feld Vorname nicht belegt, so wird die Verknüpfung zu NULL ausgewertet, also auch kein Nachname ausgegeben. Damit ist der erste Ausdruck für die CoalEsce-Funktion gleich NULL. Der zweite Ausdruck liefert jedoch einen Eintrag und wird ausgegeben.

SELECT id, order_no, title
INTO OUTFILE '/tmp/results.csv'
    FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM products_variants, web_products
WHERE product_id = id

Typisches Problem einer Query mit IN-Clause ist, dass die Reihenfolge der übergebenen IDs bei der Abfrage nicht beachtet wird. Z. B.: SELECT * FROM table WHERE id IN (1,3,2,4) wird die Datensätze nach der Reihenfolge ihrer Inserts ausgeben, also wahlscheinlich in der Reihenfolge 1,2,3,4.

Lösung: SELECT * FROM table WHERE id IN (1,3,2,4) ORDER BY FIELD(id, 1,3,2,4)

Dies scheint ein undokumentiertes Feature der MySQL DB > 5 zu sein.

SELECT COUNT(CONCAT(login, ' ',password)) AS count, CONCAT(login, ' ',password)
FROM user GROUP BY CONCAT(login, ' ',password)
HAVING COUNT(CONCAT(login, ' ',password)) > 1

Task: For each invoice, find the comment or comments with the latest date.

Use an uncorrelated subquery:

SELECT pea1.*
FROM prj_expense_approval AS pea1 JOIN (
    SELECT pea_pem_fk, MAX(pea_created_date) AS pea_created_date 
    FROM prj_expense_approval 
    GROUP BY pea_pem_fk) AS pea2
ON pea1.pea_pem_fk = pea2.pea_pem_fk AND pea1.pea_created_date = pea2.pea_created_date

http://dev.mysql.com/doc/refman/5.5/en/example-maximum-column-group-row.html

Task: INSERT a address with mailing ID 1134 in a mapping table

INSERT INTO adr_mailing_address_map
(amam_am_fk,amam_aa_fk) ( SELECT 1134, aa_id FROM adr_address WHERE aa_flag_isdefault = 1 )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment