MySQL - SELECT with LOOP

Ohh, tut mir leid, hab vergessen im Titel MySQL beizuschreiben.
Also mit einer WHILE Schleife hatte ich schon angefangen, aber das Problem war, dass ich nicht wusste, wie ich das SELECT Statement in die WHILE-Schleife kriege. Die Variante ist aber nicht sehr performant, denke ich, da er einfach nur alle Jahre abfragt.

Alternativ dachte ich an eine Rekursion, wo alle Jahre mit Komma getrennt in eine Spalte geschrieben werden und dann irgendwie splitten.
 
Mir schwebt der Einsatz einer temporären Tabelle vor. Ungefähr nach dem Schema:

- Erstellen der temporären Tabelle mittels CREATE TEMPORARY TABLE mit nur einer Spalte (jahr TYP INT)
- Füllen der Tabelle mit allen Jahren mit Hilfe einer LOOP, wobei in jedem Durchlauf das Jahr (als Zahl um eins inkrementiert wird)
- SELECT auf die temporäre Tabelle auf alle Jahre, die größer-gleich dem Start-Jahr sind und kleiner-gleich dem End-Jahr (siehe YEAR-Funktion auf die Spalten der residenten Tabelle)
- Verbindung der Ergebnisse mit der item_id

So in der Art habe ich es mir im Kopf zurecht gelegt. Was meinst du dazu?

EDIT: Anschließend kann die temporäre Tabelle wieder mittels DROP gelöscht werden.
 
Ja, stimmt. Das ist so ziemlich das einfachste^^

Aber mal ne Frage:

Geht das nicht auch ohne Temporäre Tabelle? Mit einem Subquery
 
Ok, dann mal in Häppchen:

Code:
-- Erst mal die möglichen doppelten Sachen entfernen
DROP TABLE IF EXISTS jahre;
DROP PROCEDURE IF EXISTS fuelle_jahre;

-- Temporäre Tabelle für alle möglichen Jahre erstellen
CREATE TEMPORARY TABLE jahre (jahr INT NOT NULL, CONSTRAINT UNIQUE u_jahr (jahr)) ENGINE MEMORY;

-- Stored-Procedure zum Füllen aller Jahre
DELIMITER //
CREATE PROCEDURE fuelle_jahre()
BEGIN
   DECLARE jahr_loop, max_jahr INT DEFAULT 0;

   SET jahr_loop = 1900;
   SELECT YEAR(NOW()) INTO max_jahr;

   WHILE jahr_loop <= max_jahr DO
     INSERT INTO jahre (jahr) VALUES (jahr_loop);
     SET jahr_loop = jahr_loop + 1;
   END WHILE;
END//

-- Aufrufen der SP
CALL fuelle_jahre();

-- Zum Testen obs funktioniert hat:
SELECT * FROM jahre;

-- Hier muss das SELECT für die Jahre zwischen startdate und enddate rein

-- Aufräumen
DROP TABLE jahre;
DROP PROCEDURE fuelle_jahre;
 
Ich kriege da ne Fehlermeldung. Und so wie meistens, ist sie bei MySQL auch sehr kryptisch.

Code:
ERROR: Unbekannte Interpunktion @ 387
STR: //
...
SQL-Befehl:

DELIMITER // CREATE PROCEDURE fuelle_jahre() BEGIN DECLARE jahr_loop, max_jahr INT DEFAULT 0;

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER //
CREATE PROCEDURE fuelle_jahre()
BEGIN
  DECLARE jahr_loop, max_' at line 1


Ich glaube das hatte irgendwas mit dem Delimiter bei PHPMyAdmin zu tun gehabt.
 
Bin mir nicht sicher. Teste gerade auf zwei Servern.

MySQL-Client-Version: 5.1.61
und
libmysql - mysqlnd 5.0.11-dev - 20120503
 
Damit sollte es auf jeden Fall syntaktisch funktionieren, also anscheinend wirklich ein Problem mit phpMyAdmin. Da gibt es unterhalb des SQL-Fensters das Begrenzer-Feld. stackoverflow-Antworten weisen auf diese Eingabemöglichkeit hin. Ich verwende genau aus diesem Grund schon lange kein phpMyAdmin mehr, da er aus unerfindlichen Gründen valides SQL ablehnt.
 
So, hab jetzt entdeckt, dass mein SQL doch nicht so ganz valide war. Versuch es mal damit:

Code:
DROP TABLE IF EXISTS `jahre`;
DROP PROCEDURE IF EXISTS `fuelle_jahre`;

CREATE TEMPORARY TABLE `jahre` (`jahr` INT NOT NULL, CONSTRAINT UNIQUE `u_jahr` (`jahr`)) ENGINE MEMORY;

DELIMITER //
CREATE PROCEDURE fuelle_jahre()
BEGIN
   DECLARE jahr_loop, max_jahr INT DEFAULT 0;

   SET jahr_loop = 1900;
   SELECT YEAR(NOW()) INTO max_jahr;

   WHILE jahr_loop <= max_jahr DO
     INSERT INTO jahre (jahr) VALUES (jahr_loop);
     SET jahr_loop = jahr_loop + 1;
   END WHILE;
END//
DELIMITER ;

CALL fuelle_jahre();

SELECT * FROM `jahre`;

DROP TABLE `jahre`;
DROP PROCEDURE `fuelle_jahre`;
 

Neue Beiträge

Zurück