MySQL Select und Insert in Java

Bitte aktiviere JavaScript!
Hallo ihr lieben und ich hoffe ihr könnt mir bei meinem Problem helfen.
Ich habe eine Datenbank (liste nur das auf was derzeit mein problem betrifft)
Es geht um ein Hotel.
Ich habe eine Tabelle Zimmer mit den Spalten Zimmer_ID, Bezeichnung und Art.
Unter Art sind "einzel" und "doppel" Zimmer, die nötige anzahl an den jeweiligen Zimmern sind in der Datenbank schon vorhanden.
Die zweite Tabelle ist buchung. Dort sind die Spalten FK_Zimmer_ID mit verknüpfung zur Zimmer_ID, Anreise und Abreise als Date.

Nun möchte ich in meinem Java-Code ein Select bzw. Insert schreiben das in meiner DB schaut in buchungen welche Zimmer belegt sind um dann die passenden einzel bzw. doppelzimmer zu buchen die gerade gebraucht werden.

Als Bsp.: ein Gast bucht 1 einzel und 1 doppelzimmer, in DB schauen was frei ist um dann 1 einzel und ein doppelzimmer zu buchen.
Versuche schon seit ein paar Tagen mich daran aber bekomme es irgendwie nicht hin.
Ich hoffe sehr das ihr mir bei meinem Problem helfen könnt.
 
A

Anzeige




Vielleicht hilft dir unser Java-Tutorial hier weiter —> (hier klicken)
ein Gast bucht 1 einzel und 1 doppelzimmer
Das sind zwei Buchungsanfragen, wobei der Zeitraum fehlt. Je Anfrage gibt es drei Parameter: die gewünschte Anreise, Abreise, und Zimmerart (:g_anreise, ...)

SQL:
SELECT * FROM zimmer
 WHERE art = :g_art
   AND zimmer_id NOT IN (
    SELECT zimmer_id FROM buchung
     WHERE :g_anreise < abreise 
       AND :g_abreise >= anreise
    )
Das packst Du in ein PreparedStatement, setzt die Parameter, führst die Abfrage aus und kannst dann über ein ResultSet mit den freien Zimmern iterieren.
 
Code:
DELIMITER //

CREATE FUNCTION FindeZimmer( :g_art VARCHAR  )
RETURNS INT

BEGIN

   DECLARE zimmer_id  INT;

 SET zimmer_id =   
(SELECT zimmer_id FROM zimmer
 WHERE art = :g_art
   AND zimmer_id NOT IN (
    SELECT zimmer_id FROM buchung
     WHERE :g_anreise < abreise 
       AND :g_abreise >= anreise
    ))

   RETURN zimmer_id;

END; //

DELIMITER ;

INSERT into buchung values (FindeZimmer(:g_art),usw.....
 
Ich musste vor kurzem feststellen, dass MySQL ziemlich bescheiden ist, was Optimierungen bzgl. GROUP BY in Views betrifft: da wird gar nix optimiert :-(
 
Wäre interessant das mal auszuprobieren. Aber wäre schon ein extremes Armutszeugnis wenn er wirklich erstmal alles joined um es dann mit dem where wieder rauszuwerfen. Das kann ich mir nicht vorstellen.

Gruß

Claus
 
Wäre interessant das mal auszuprobieren. Aber wäre schon ein extremes Armutszeugnis wenn er wirklich erstmal alles joined um es dann mit dem where wieder rauszuwerfen. Das kann ich mir nicht vorstellen.
Das kannst Du gerne machen. Im Wesentlichen ging es um eine (etwas kompliziertere als hier dargestellte) Abfrage der Art
SQL:
SELECT * FROM (SELECT bill_id, sum(price) total FROM bill_pos GROUP BY bill_id) x WHERE x.bill_id = 123;
Wobei der Subselect tatsächlich als View vorlag und auf bill_id natürlich ein Index liegt. Man hätte erwartet, dass der Optimierer daraus
SQL:
SELECT bill_id, sum(price) total FROM bill_pos WHERE bill_id=123 GROUP BY bill_id
bastelt. Tatsächlich wurde aber erst
SQL:
SELECT bill_id, sum(price) total FROM bill_pos GROUP BY bill_id
ausgeführt und dann aus dem Ergebnis die Zeile mit bill_id 123 ermittelt :eek:
 
Deswegen sage ich ja subselects nur benutzen wenn es nicht anders geht. Mit denen habe ich bisher auch nur schlechte Erfahrungen gemacht. Bei mir waren joins immer um ein wesentliches schneller...
 
Wenn das Problem nur am Subselect liegen würde (den habe ich hier nur zur Verdeutlichung verwendet): der Spaß tritt ja auch auf, wenn Du den inneren SELECT als View anlegst und diese verwendest: SELECT * FROM bill_sums WHERE id = 123;

Das Fazit, das ich daraus gezogen haben: verwende für die Anwendung keine Aggregate-Views mit MySQL.

Vielleicht haben sie das in neueren MySQL-Versionen auch schon behoben. Falls nicht: die Lösung wäre vermutlich, eine Rewrite-Engine zu verwenden. Aber ganz ehrlich: bevor ich da neue Komponenten einführe, die irgendwas im Hintergrund veranstalten, baue ich den SELECT lieber in der Anwendung zusammen.
 
A

Anzeige




Hier lernst du alle wichtigen Java-Grundlagen.
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben