Melvin Cowznofski: MySQL Abfrage gesucht

Hallo,

ich bin Überlegen, wie ich zu einer bestimmten Ergebnismenge aus einer DB komme, habe aber keinen Ansatz, wie das zu lösen ist. Gegeben sind als fiktives Beispiel die 2 Tabellen "Kinderbetreuer" und "Kinder":

Tabelle "Kinderbetreuer":

#########################

ID # Betreuer         #

#########################
#  2 # Claudia Huber    #
#  4 # Bernadette Mieze #
#  5 # Christian Hauser #
#  7 # Ida Wulle        #
#  9 # Martin Steiner   #
#########################

Tabelle "Kinder":

######################################

ID # Kind               # Betreuer

######################################
#  2 # Thorsten Huber     #  2       #
#  3 # Fransiska Bell     #  2       #
#  5 # Theo Lutz          #  4       #
#  7 # Maria Mollmann     #  5       #
#  8 # Chantale Dorr      #  4       #

10 # Edith Huber        #  2       #

12 # Franz Groster      #  4       #

13 # Andrea Wellsbacher #  5       #

######################################

Mit welcher MySQL Abfrage finde ich heraus, welche Betreuer aus Tabelle 1 keine Kinder aus Tabelle 2 betreuen? (In dem Fall wären also die IDs 7 und 9 das erwartete Ergebnis)

Danke im Voraus für jede Hilfe & jeden Denkanstoss!

Mit lieben Grüßen

Melvin Cowznofski

--

Melvin Cowznofski
What – me worry?
  1. Tach!

    Mit welcher MySQL Abfrage finde ich heraus, welche Betreuer aus Tabelle 1 keine Kinder aus Tabelle 2 betreuen?

    Mit Subquery und NOT EXISTS(...).

    SELECT spalten FROM betreuer WHERE NOT EXISTS(SELECT * FROM kinder WHERE betreuer = betreuer.id)

    dedlfix.

    1. Hallo dedlfix,

      Mit Subquery und NOT EXISTS(...).

      vielen Dank, hochgeschätzter Gott der Datenbankologie, ich hatte insgeheim eh gehofft, dass Du schon munter bist und die Frage liest! :)

      Mit lieben Grüßen

      Melvin Cowznofski

      --

      Melvin Cowznofski
      What – me worry?
      1. vielen Dank, hochgeschätzter Gott der Datenbankologie, ich hatte insgeheim eh gehofft, dass Du schon munter bist und die Frage liest! :)

        "Der" ist einer für die Zitat-Datenbank...

        Hiermit die Bitte an einen der Moderatoren, das in die DB der Zitate aufzunehmen.

        Mik

    2. Hi,

      Tach!

      Mit welcher MySQL Abfrage finde ich heraus, welche Betreuer aus Tabelle 1 keine Kinder aus Tabelle 2 betreuen?

      Mit Subquery und NOT EXISTS(...).

      SELECT spalten FROM betreuer WHERE NOT EXISTS(SELECT * FROM kinder WHERE betreuer = betreuer.id)

      ist das günstiger als

      SELECT spalten FROM betreuer WHERE id NOT IN (SELECT distinct betreuer FROM kinder)

      Was günstiger ist, ist ggf. aber auch von der Anzahl der Zeilen in den Tabellen abhängig.
      Daß auf betreuer in der kinder-Tabelle ein Index liegt, setze ich voraus.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. Tach!

        Mit welcher MySQL Abfrage finde ich heraus, welche Betreuer aus Tabelle 1 keine Kinder aus Tabelle 2 betreuen?
        [...]
        ist das günstiger als
        [...]

        Ich glaube nicht, dass es sich überhaupt lohnt, darüber nachzudenken. Bei Kindern und Betreuern wird es sich garantiert nicht um eine hochfrequentierte Big-Data-Anwendung handeln. Die Abfrage wird in beiden Fällen ausreichend schnell sein.

        Sollte es sich aber doch um deutlich mehr Daten handeln als beim Beispiel-Szenario, kann ich auch keine eindeutige Antwort liefern. Ich weiß nicht, wie sich der MySQL-Optimizer entscheiden wird, die Angelegenheit intern zu regeln. Da muss man mal ein paar Messungen mit realistischem Datenbestand und in der Praxis vorkommenden Abfragen vergleichen (nebst der Ausgabe von EXPLAIN).

        dedlfix.

        1. Hi,

          Mit welcher MySQL Abfrage finde ich heraus, welche Betreuer aus Tabelle 1 keine Kinder aus Tabelle 2 betreuen?
          [...]
          ist das günstiger als
          [...]

          Ich glaube nicht, dass es sich überhaupt lohnt, darüber nachzudenken. Bei Kindern und Betreuern wird es sich garantiert nicht um eine hochfrequentierte Big-Data-Anwendung handeln. Die Abfrage wird in beiden Fällen ausreichend schnell sein.

          War auch nicht so wichtig - mir kam spontan (noch bevor ich Deine Antwort gelesen hatte, meine Abfrage in den Sinn). Und war dann überrascht, daß Du eine ganz andere Variante gewählt hast.

          Daß ich nicht not exists gewählt hab, liegt vielleicht daran, daß das bei uns auf Arbeit immer mal wieder Probleme macht. Da allerdings mit Oracle statt MySQL, und mit Tabellen mit ein paar mehr Einträgen (eine mit über 1 Mrd, mehrere mit über 100 Mios, und einige mit zig Mios ...)

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.