MySQL Abfrage!
lvl
- datenbank
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.
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
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?
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
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ß
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
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
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.
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
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)