Tobias Wust: MySQL: group_concat in where-teil

Hallo hallo,

ich komme mit folgendem Problem leider nicht weiter:

SELECT group_concat( nem.EM
SEPARATOR ', ' ) AS 'all.EM', neinsaetze.EINSATZNUMMER
FROM neinsaetze
JOIN nem ON neinsaetze.einsatznummer = nem.einsatznummer
GROUP BY neinsaetze.einsatznummer

ergibt:

all.EM                                           EINSATZNUMMER
99-11, 12-42, 10-30, 10-13, 10-10                1100000136
99-11, 10-30, 10-5, 10-13, 12-42, 10-10, 12-42   1100000137

Ich würde gerne soetwas machen wie
WHERE all.EM LIKE %10-5% um die zweite Zeile zu finden.

Weiß jemand eine Lösung oder eine Alternative?

  1. Hallo,

    SELECT group_concat( nem.EM
    SEPARATOR ', ' ) AS 'all.EM', neinsaetze.EINSATZNUMMER
    FROM neinsaetze
    JOIN nem ON neinsaetze.einsatznummer = nem.einsatznummer
    GROUP BY neinsaetze.einsatznummer

    ergibt:

    all.EM                                           EINSATZNUMMER
    99-11, 12-42, 10-30, 10-13, 10-10                1100000136
    99-11, 10-30, 10-5, 10-13, 12-42, 10-10, 12-42   1100000137

    Ich würde gerne soetwas machen wie
    WHERE all.EM LIKE %10-5% um die zweite Zeile zu finden.

    Weiß jemand eine Lösung oder eine Alternative?

    a) die HAVING-Klausel nutzen:

    HAVING all.EM LIKE '%10-5%'

    b) die relevante Einsatznummer(n) über ein Subselect herausfinden:

    WHERE  
        einsatznummer IN (  
            SELECT  
                nem2.einsatzunummer  
            FROM  
                nem nem2  
            WHERE  
                nem2.EM = '10-5'  
        ) 
    

    Es ist Deine Aufgabe herauszufinden, welche der beiden bei Deinen Daten performanter ist. Vermutlich ist es die Lösung mit dem Subselect, weil sie von vornherein viele Datensätze ausfilter. Bei HAVING wird zunächst die gesamte Lösungsmenge ermittelt und erst zum Schluss das ausgefiltert, was Du benötigst.

    Freundliche Grüße

    Vinzenz

    1. Wo dieses nem2 aus dem nichts herkommt verstehe ich nicht, aber die Lösung funktioniert wunderbar.

      Vielen Dank dafür!

      1. Hallo Tobias,

        Wo dieses nem2 aus dem nichts herkommt verstehe ich nicht,

        wie sag' ich so gern: Code ohne Kommentare ist schlechter Code:

        WHERE  
            einsatznummer IN (  
                SELECT  
                    nem2.einsatzunummer  
                FROM  
                    nem nem2            -- Aliasname für die Tabelle nem.  
                                        -- Bei mehrfachem Zugriff auf die gleiche  
                                        -- Tabelle nötig, damit das DBMS die Zugriffe  
                                        -- unterscheiden kann.  
                WHERE  
                    nem2.EM = '10-5'  
            )  
        
        

        aber die Lösung funktioniert wunderbar.
        Vielen Dank dafür!

        Schön zu hören. Wir helfen gerne. Echte Hilfe versetzt denjenigen, dem geholfen werden soll, in die Lage, die Lösung zu verstehen und auf vergleichbare Problemstellungen anwenden zu können. Ich hoffe, Du hast die wesentlichen Unterschiede zwischen den beiden von mir vorgeschlagenen Lösungsansätzen verstanden. Ich hoffe, Du hast verstanden, warum beide Vorschläge zu dem von Dir gewünschten Ergebnis führen.

        Freundliche Grüße

        Vinzenz