SQL utmaningar

Har under gårdagen och förmiddagen idag arbetat med ett projekt i databas och då jobbar med en hel del SQL funktioner. Jag är sedan tidigare bekant med de vanliga funktionerna som INSERT, UPDATE mm men för att kunna utföra det vi ska göra i projektet så behövs lite mer, det är nämligen tänkt att man ska kunna boka flygningar, något som jag skulle löst med php funktioner ska alltså lösas med SQL funktioner, och det finns faktiskt en hel del fler saker än vad jag vetat om sen tidigare och man kan göra en hel del på en så pass låg nivå, även om jag föredrar att göra vissa av dessa saker en nivå upp. Tänkte komma med ett exempel på en funktion som vi gjorde igår som innehåll en del nya saker för mig.

 
CREATE FUNCTION passenger_count( dayid INT) RETURNS INT
  BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE bookid INT;
    DECLARE pcount INT DEFAULT 0;
    DECLARE pnum INT DEFAULT 0;

    DECLARE cursor_bookid CURSOR FOR SELECT BookingID FROM Booking WHERE DayID = dayid;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

    OPEN cursor_bookid;

    REPEAT
      FETCH cursor_bookid INTO bookid;
      IF NOT done THEN
        SELECT COUNT(*) INTO pnum FROM Booked WHERE BookingID = bookid;
        SET pcount = pcount + pnum;
      END IF;
    UNTIL done END REPEAT;

    CLOSE cursor_bookid;
    RETURN pcount;
  END;

  /* Kalla på funktionen sen */
  SELECT passenger_count(2);

Det funktionen gör är att räkna hur många passagerare som är bokade för en viss flygning.

Edit: Detta skulle säkerligen kunna lösas lite enklare men detta gjorde vi för att lära oss nya saker som SQL erbjuder, men en alternativ lösning skulle kunna vara:

SELECT COUNT(*) AS pcount FROM Booked WHERE 
       BookingID IN (SELECT BookingID FROM Booking WHERE DayID = dayid);
Dela med dig
Det här inlägget postades i Programmering och har märkts med etiketterna , , . Bokmärk permalänken.

7 kommentarer till SQL utmaningar

  1. ai skriver:

    SELECT count(*) as allBookings FROM Booking WHERE DayID = dayid ger samma resultat?

  2. Mikael Andersson skriver:

    AI << Nej eftersom det är två olika tabeller en med bokningar och en med bokade per bokning, det kan alltså vara flera som är bokade på samma bokning. Det går garanterat göra det med en SQL SELECT men nu var det meningen vi skulle lära oss hantera functions och loopar och sådant i dessa :)

    Men detta kanske skulle fungera:
    SELECT COUNT(*) AS allBooking FROM Booked WHERE BookingID IN (SELECT BookingID FROM Booking WHERE DayID = dayid);

  3. robban skriver:

    Först var det lite svårt att förstå inledningen. Sedan blev det lite besvärligt att hänga med i mittenpartiet, men på slutet så blev jag helt klar på att jag inte begrep något alls. Oj, vad skönt att jag inte behöver förstå detta. Nu vet jag var jag kan höra av mig om jag skulle få några SQL-problem.

  4. Mathias skriver:

    Borde det inte gå snabbare utan pekare?

  5. Mikael Andersson skriver:

    Robban<< Visste inte att du jobbade med databaser 😉

    Mathias << Min lösning 2 lär säkert gå betydligt snabbare men vill man lösa det med en loop så vet jag inget annat sätt som man kan lösa det på, då måste man ha pekare.

  6. Han Lin Yap skriver:

    Behöver du inte ändra DELIMITER till funktionen?

  7. Mikael Andersson skriver:

    Han Lin << Det beror på vart du kör funktionen någon stans :)

Kommentarer inaktiverade.