lvl: MySQL Abfrage!

Hi all.

Also ich habe folgende MySQL Datenbank

+------------------------------+
|ID|PersonenFID|Gruppe|Typ|Wert|
+------------------------------+
|1 |0815       |MA    |ST |Ger |
|2 |0815       |MA    |IT |Ait |
|3 |0816       |MA    |ST |Ger |
|4 |0816       |MA    |IT |Bom |
|5 |0817       |MA    |ST |Aus |
|6 |0817       |MA    |IT |Ait |
+------------------------------+

Er soll mir die PersonenFID ausgeben unter folgenden Bedingungen.

(Typ = ST
und
Wert = Ger)

UND

(Typ = IT
und
Wert = Ait)

Wichtig ist: Ich möchte wissen, welche PersonenFID den ST auf Ger hat und zusätzlich wo das IT auf Ait steht.

  1. Hi,

    du gibst dir die Lösung doch schon selbst....

    (Typ = ST
    und
    Wert = Ger)

    UND

    (Typ = IT
    und
    Wert = Ait)

    Also ich würd sagen:
    SELECT PersonenFID
    FROM Tabelle
    WHERE ((Typ = ST) AND  (Wert = Ger)) OR ((Typ = IT) AND (Wert = Ait))

    HtH,
      Juan

    1. Also ich würd sagen:
      SELECT PersonenFID
      FROM Tabelle
      WHERE ((Typ = ST) AND  (Wert = Ger)) OR ((Typ = IT) AND (Wert = Ait))

      Da hast du wohl ein Und übersehen.
      Da wo OR steht müsste ein AND stehen.

      Geht das?

      1. Moin,

        Also ich würd sagen:
        SELECT PersonenFID
        FROM Tabelle
        WHERE ((Typ = ST) AND  (Wert = Ger)) OR ((Typ = IT) AND (Wert = Ait))

        Da hast du wohl ein Und übersehen.
        Da wo OR steht müsste ein AND stehen.

        Geht das?

        Das geht natürlich nicht, denn wie soll denn Typ gleichzeitig ST und IT sein?
        Eine Zeile kann ja nur zu einem Typ gehören...

        Grüsse,
          Juan

  2. Hi!

    (Typ = ST
    und
    Wert = Ger)

    UND

    oder ODER?

    (Typ = IT
    und
    Wert = Ait)

    So ist das jedenfalls unmöglich ein Ergebnis zu erhalten, denn der Typ kann entweder ST der IT sein, das gleich gilt für den Wert.
    Falls du jedoch ODER und nicht UND meinst:
    Select <was_du_haben_willst> FROM <wo_es_her_kommt> WHERE <deine_erste_einschränkung> OR <deine_zweite_einschränkung>

    Gruß

    1. So ist das jedenfalls unmöglich ein Ergebnis zu erhalten, denn der Typ kann entweder ST der IT sein, das gleich gilt für den Wert.

      Stell dir einfach vor es wäre richtig geschrieben.

      *schäm*
      Gruß
      Oliver

  3. Hallo,

    auf die Schnelle fällt mir so etwas ein:
    SELECT PersonenFID, (TYP='ST' AND Wert='Ger') AS gruppe_1, (TYP='IT' AND Wert='Ait') AS gruppe_2 FROM tabelle

    Damit definierst Du Dir zwei Variablen (gruppe_1 und gruppe_2), welche die gewünschte Information enthalten und welche natürlich auch Teil des Suchergebnisses sind.
    Das funktioniert jedenfalls.

    Eleganter wäre eine Lösung mit GROUP BY, aber damit fällt mir jetzt konkret zu Deinem Problem keine Lösung ein.

    Ciao,
    Andreas

    --
    "Das Corporate Design für das Internet sieht eine Reihe von Grafikelementen vor, die die Optik der Webseite visuell und funktionell beeinflussen." - (Zitat aus dem "Styleguide Corporate Design"  eines großen Konzerns...)
  4. Hallo lvl,

    Also ich habe folgende MySQL Datenbank

    etwas exakter: Du hast eine Tabelle in einer MySQL-Datenbank. Es kann natürlich sein, dass Deine Tabelle die einzige der Datenbank ist :-)

    +------------------------------+
    |ID|PersonenFID|Gruppe|Typ|Wert|
    +------------------------------+
    |1 |0815       |MA    |ST |Ger |
    |2 |0815       |MA    |IT |Ait |
    |3 |0816       |MA    |ST |Ger |
    |4 |0816       |MA    |IT |Bom |
    |5 |0817       |MA    |ST |Aus |
    |6 |0817       |MA    |IT |Ait |
    +------------------------------+

    Er soll mir die PersonenFID ausgeben unter folgenden Bedingungen.

    (Typ = ST
    und
    Wert = Ger)

    UND

    (Typ = IT
    und
    Wert = Ait)

    Wichtig ist: Ich möchte wissen, welche PersonenFID den ST auf Ger hat und zusätzlich wo das IT auf Ait steht.

    Ich habe den ganzen Thread lesen müssen, um zu verstehen was Du wirklich meinst. Für Dein Problem benötigst Du einen JOIN, und zwar einen ganz speziellen: einen JOIN auf die gleiche Tabelle. Damit Du unterscheiden kannst, aus welcher Tabelle Du die Daten nimmst, musst Du Alias-Namen vergeben.

      
    SELECT  
      a.PersonenFID  
    FROM Tabelle AS a  
    INNER JOIN Tabelle AS b  
    ON a.PersonenFID = b.PersonenFID  
    WHERE ( a.Typ = 'ST' AND a.Wert = 'Ger')  
          AND (b.Typ = 'IT' AND b.Wert = 'Ait')  
    
    

    Somit kriegst Du alle PersonenFIDs, die zum einen einen Eintrag mit der Kombination (ST/Ger) und zum anderen einen Eintrag mit der Kombination (IT/Ait) haben.

    Freundliche Grüße

    Vinzenz,

    der sich notiert hat, dass der Selfjoin in den einen oder anderen Artikel über die Joins gehört.

    1. Hi Vinzenz,

      Self-Joins, jaja, das ist so eine Sache. Ich glaub ich komme vor dem Wochenende nicht zum Weiterschreiben, schlage aber folgendes vor:
      Ich vereinheitliche meinen Artikel noch, also bei der Normalisierungsmotivation nehme ich das selbe Beispiel wie unten.
      Am Ende bzw. an der Stelle JOIN-Grundlagen verweise ich dann auf deinen weiterführenden Artikel, bzw. mehrere falls man sich entscheidet SelfJOIN doch mehr in irgend was weiteres einzusortieren.
      Mein Artikel bildet dann gewissermaßen ein kleines Grundlagenwert, man kann ab dort dann weiterlesen und das Thema vertiefen.
      -----------
      Zum Problem:
      Self-Join ist relativ starr, finde ich persönlich, ich würde es über ein GROUP BY versuchen:
      SELECT ID, PersonFID, Gruppe
      FROM tabelle
      WHERE ((typ = 'ST') AND (wert = 'Ger'))
         OR ((typ = 'IT') AND (wert = 'Ait'))
      GROUP BY ID, PersonFID, Gruppe
      HAVING COUNT(*) = 2

      Das Select bringt - sofern die Person zur Treffermenge gehört - zwei Datensätze, durch die Gruppierung werden sie vereint und ein Zählen ergibt "waren zwei".
      Möchte man nun einen haben, der 3 Kombinationen erfüllt, braucht man einfach nur einen OR-Block anzufügen und das COUNT auf 3 zu setzen.

      MfG
      Rouven

      --
      -------------------
      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
      1. Hallo Rouven,

        Self-Joins, jaja, das ist so eine Sache. Ich glaub ich komme vor dem Wochenende nicht zum Weiterschreiben, schlage aber folgendes vor:
        Ich vereinheitliche meinen Artikel noch, also bei der Normalisierungsmotivation nehme ich das selbe Beispiel wie unten.
        Am Ende bzw. an der Stelle JOIN-Grundlagen verweise ich dann auf deinen weiterführenden Artikel, bzw. mehrere falls man sich entscheidet SelfJOIN doch mehr in irgend was weiteres einzusortieren.

        mit dieser Vorgehensweise kann ich mich anfreunden. Ich arbeite derzeit meinen Artikel um, ein Tag Abstand zu nehmen, hat gut getan.

        Mein Artikel bildet dann gewissermaßen ein kleines Grundlagenwert,

        der für bestimmt 90% aller Fragen bereits die Antwort liefert.

        Zum Problem:
        Self-Join ist relativ starr, finde ich persönlich,

        da hast Du wohl recht, vermutlich ist mein Vorschlag auch nicht besonders performant, aber als Beispiel für einen Selfjoin durchaus akzeptabel :-)

        Freundliche Grüße

        Vinzenz (mit Scheuklappen)