[SQL allgemein] Select Optimierung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL allgemein] Select Optimierung

    Hallo zusammen,

    ich hätte hier mal eine Frage zur "SELECT" Optimierung:

    ich habe zwei Tabellen:

    1. "test_locations" (Liste von verfügbaren Locations):

    CREATE TABLE IF NOT EXISTS `test_locations` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `name` varchar(100) default NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

    2. "test_termine" (dazugehörige Belegung der Locations):

    CREATE TABLE IF NOT EXISTS `test_termine` (
    `location_id` int(11) unsigned NOT NULL,
    `week` int(10) unsigned default NULL,
    `frei` tinyint(1) default '0',
    KEY `location_id` (`location_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


    Tabelle 1 ist 1:n mit Tabelle 2 verknüpft. Für jede Location in Tabelle 1 gibt es n Einträge in Tabelle zwei (Für jede Woche eines Jahres einen Eintrag, der angibt ob diese Woche noch frei ist oder eben nicht).

    Nun möchte ich eine Suchanfrage stellen, welche mir zum Beispiel alle Locations auswirft, die von Woche 40-45 frei sind.

    Ich habe das ganze mit einem Subquery gelöst:

    SELECT
    l.*
    FROM
    test_locations l
    WHERE
    1
    AND 5 = (
    SELECT
    count(location_id)
    FROM
    test_termine
    WHERE
    1
    AND
    location_id=l.id
    AND
    week >= 40
    AND
    week <= 45
    AND
    frei=1
    )


    Kurze Erläuterung:

    Ich suche alle Locations, welche 5 Wochen (Woche 40-45) am Stück frei sind. Also muss es in der Tabelle "test_termine" genau 5 Einträge geben, welche für die genannten Wochen frei sind.

    Mein Frage lautet nun:

    Kann man diese Aufgabe auch einfacher lösen? Ich denke die Lösung mit Subquery ist viel zu aufwendig und leider nicht die schnellste Lösung - gerade wenn es mehrere 10000 Location gibt.

    Vielen Dank

    Gruß
    waYan

  • #2
    Also muss es in der Tabelle "test_termine" genau 5 Einträge geben, welche für die genannten Wochen frei sind.
    Warum gibt es dort überhaupt schon Einträge für Wochen die noch gar nicht belegt sind? Die dürften bei einem sauberen DB-Layout noch gar nicht existieren.

    Kommentar


    • #3
      @TobiaZ

      na das ging ja schnell... thx...

      was würde es denn an der Problemstellung ändern, wenn nicht belegte Wochen nicht auftauchen würden?

      Kommentar


      • #4
        Na das Problem oder die Aufgabe bleibt sie selbe, aber du kannst mit ner deutlich simpleren Query und IS NULL ganz fix überprüfen obs schon datensätze gibt, die in den zeitraum fallen. Wenn ja, dann ist besetzt.

        Such mal nach Belegungsplan o.ä. und schau dir an, wie es andere machen...

        Kommentar


        • #5
          mhhh ok... leider aber kann ich das Layout oder eher die Daten in den Tabellen nicht beinflussen....

          Kommentar


          • #6
            Du kannst doch einfach die Countquery (die du jetzt als subquery hast) ausführen und mysql_num_rows verwenden?

            Ansonsten: Kann nicht heißt häufig will nicht in diesem Zusammenhang... Deins ist nunmal genau eins von den Problemen die man mit nicht idealem Datenbankdesign bekommt. Ich würde dir empfehlen dies zu ändern.
            ich glaube

            Kommentar


            • #7
              Vielen Dank erstmal für die schnellen Antworten - damit habe ich nun nicht gerechnet


              Hier nochmal eine andere Version des Problems:

              Stellt euch vor es gäbe eine Tabelle mit Preisen pro Woche.

              CREATE TABLE IF NOT EXISTS `test_preise` (
              `location_id` int(11) unsigned NOT NULL,
              `week` int(10) unsigned default NULL,
              `preis` int(11) default '0',
              KEY `location_id` (`location_id`)
              ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

              Nun habe ich wieder dasselbe Problem, wenn ich alle Locations innherhab einer Preis und Zeitspanne haben möchte.

              Gibt es in dieser Tabelle nur Einträge, welche auch verfügbar sind, muss ich mir die Preise mit einem extra Query holen - was auch wieder Zeit kostet.

              Ich möchte am liebsten alle wichtigen Informationen mit einem Query holen (Verfügbar, Durchschnittspreis in Zeitspanne).

              Die Version oben mit subquery macht genau das - ich denke eben halt blos zu langsam....

              Gruß
              waYan

              Kommentar

              Lädt...
              X