Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Mal angenommen ich habe folgende Beispieltabelle


[ID] [Person] [Datum] [Wert]
1 A 1.11.07 xy
2 A 3.11.07 ab
3 B 1.11.07 xy
4 B 5.11.07 xy
5 B 1.10.07 ab
6 C 2.11.07 tz
7 C 3.11.07 xy
8 A 1.11.07 rt
9 C 2.11.07 iu
10 D 7.11.07 xy
[/PHP]

ich möchte jetzt alle Personen haben wo kein Wert xy mit dem Datum ab dem 5.11.07 existiert.

Also müsste in der Ergebnismenge A und C enthalten sein. Aber wie muss dazu die SQL Anweisung aussehen?

Zerleg die Anforderung in 2 Teile und pack beide eine gemeinsame Abfrage

1. Nehme alle Personen für die ein Satz xy mit Datum >= 5.11 existiert

2. Nehme alle Personen die nicht in der ersten Abfrage gefunden wurden

lösen könnte man es mit except oder einem not in

(wähle alle Personen) where Person not in (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert)

(wähle alle Personen) except (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert)

versuch mal beide Varianten und schau was schneller geht, auf Anhieb fällt mir keine wirklich schnellere Methode ein

Mal angenommen ich habe folgende Beispieltabelle


[ID] [Person] [Datum] [Wert]
1 A 1.11.07 xy
2 A 3.11.07 ab
3 B 1.11.07 xy
4 B 5.11.07 xy
5 B 1.10.07 ab
6 C 2.11.07 tz
7 C 3.11.07 xy
8 A 1.11.07 rt
9 C 2.11.07 iu
10 D 7.11.07 xy
[/PHP]

ich möchte jetzt alle Personen haben wo kein Wert xy mit dem Datum ab dem 5.11.07 existiert.

Also müsste in der Ergebnismenge A und C enthalten sein. Aber wie muss dazu die SQL Anweisung aussehen?

Hmmm, wenn ich das richtig sehe, kommt da nichts vernünftiges bei heraus. Es gibt genau zwei Datensätze, die das Datum größer gleich 05.11.07 haben, Datensatz 4 und 10. Beide Datensätze haben aber xy als Wert. Ergebnis = 0 Datensätze.

Aber um das mal aufzugreifen:

SELECT Person, Datum, Wert

FROM Tabellenname

WHERE Datum>=05.11.2007 AND Not Wert=xy

Gruß

Bogomip

  • Autor

@Bogomip nein du hast die Problemstellung falsch verstanden. Es soll keiner dieser Datensätze als Ergebnis rauskommen. Sondern die Personen wo kein Datensatz mit dem Wert xy und einem Datum ab dem 5.11.07 existiert.

Die Lösung von Jan Jansen sollte das eigentlich machen, ich kanns leider noch nicht probieren weil ich mir nur vorab schonmal Gedanken um eine Problemstellung mache die ich bald lösen muss.

Bin aber trotzdem für weitere Vorschläge dankbar :)

Wie wär's damit:


SELECT DISTINCT Person

  FROM Tabellenname

 WHERE Datum < 5.11.07

   AND Wert <> 'xy'

  • Autor
lösen könnte man es mit except oder einem not in

(wähle alle Personen) where Person not in (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert)

(wähle alle Personen) except (wähle alle Personen für die ein Satz 'xy' mit Datum >= 5.11 existiert)

versuch mal beide Varianten und schau was schneller geht, auf Anhieb fällt mir keine wirklich schnellere Methode ein

Ich hab das jetzt doch mal mit ein paar anderen Daten simuliert und das funktioniert beides, wobei man sich bei dem except das GROUP BY Person sparen kann.

Welches jetzt schneller ist kann ich aber nicht sagen da nur ca 1400 Datensätze in der Tabelle waren und beides somit sehr schnell war.

EDIT:

Wie wär's damit:


SELECT DISTINCT Person

  FROM Tabellenname

 WHERE Datum < 5.11.07

   AND Wert <> 'xy'

Nein das passt ja auch nicht zur Problemstellung da es lediglich alle Personen liefert die diesen Datensatz vor dem 5.11 haben und nicht die die ihn nicht ab dem 5.11 haben.

Tschuldigung, Ich hatte "bis" gelesen.

Bei meinem Statement also einfach das < durch >= ersetzen, dann sollte es passen:

SELECT DISTINCT Person

  FROM Tabellenname

 WHERE Datum >= 5.11.07

   AND Wert <> 'xy'
Damit bekommst du alle Personen, die ab dem 5.11.07 den Wert 'xy' nicht haben. Oder willst du alle Personen haben, bei denen es einen Eintrag nach dem 05.11.07 gibt, bei denen aber auch vor dem 05.011.07 kein 'xy' auftaucht? Dann geht folgendes Statement:

SELECT DISTINCT Person

  FROM Tabellenname

 WHERE id IN (SELECT id 

                FROM Tabellenname

               WHERE Wert <> 'xy')

   AND Datum >= 5.11.07

  • Autor

Damit bekommst du alle Personen, die ab dem 5.11.07 den Wert 'xy' nicht haben.

Nein das passt genauso wenig zur Problemstellung wie das andere. Damit lieferst du nur alle Datensätzte die auch andere Werte als xy ab dem 5.11 haben, aber nicht die die xy nicht haben. Letzteres macht bisher nur Jan Jansens Lösung (und die von dimitri weils ja praktisch die Selbe ist).

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.