wie muss ich abfragen?

gma

Aktives Mitglied
Thread Starter
Dabei seit
18.02.2007
Beiträge
119
Reaktionspunkte
2
Hallo,

ich weis leider nicht wie ich die Abfrage für folgende Fragestellung formulieren muss:

Tabelle Referenz:

POSITION INHALT
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j


Tabelle Auswahl:

VON BIS
2 3
7 10


Select soll neue Tabelle schreiben, die alle Reihen von VON bis BIS enthält:

2 b
3 c
7 g
8 h
9 i
10 j


Wie muss die Abfrage lauten?

gma
:confused:
 
vergessen: meine Anfrage bezieht sich auf MySQL-Datenbanken.

gma
 
Eine reine SQL-Lösung fällt mir auf die Schnelle nicht ein.
Ich würde mit einer Skriptsprache (bei Dir PHP?) die komplette Zahlenreihe aus der Tabelle auswahl ermitteln. In Deinem Fall also $x = '2,3,7,8,9,10' und dann
Code:
SELECT * FROM referenz WHERE position IN ($x)
 
Mir fällt da auch keine reine SQL Lösung ein.

Das "Problem" ist, dass von-bis eine gewisse eigenständige Logik birgt, die du mit SQL nicht realisieren kannst. Jedenfalls nicht, wenn sich von-bis ändern kann.

Denkbar in SQL wäre etwas in der Art:
Code:
SELECT * FROM Inhalt INNER JOIN Auswahl ON inhalt.id = auswahl.id
Guck mal hier rein. Da sind die Joins ganz anschaulich erklärt.

Da du aber offensichtlich eine gewisse Abfragelogik dahinter hast, bietet sich vielleicht tatsächlich eine Skriptsprache an.
 
Danke soweit erstmal. Hatte mir schon gedacht, nachdem ich im (allerdings auch sehr dicken) MySQL-Handbuch nichts gefunden habe, dass es nur mit externen Skripts zu machen ist.

Kann kein PHP, programmiere aber ab und zu kleine Skripts in Perl, da gibt es ja auch entsprechende Module, um direkt mit den Datenbank zu kommunizieren. Muss ich mir dann wohl mal anschauen.

Auf der anderen Seite sehe ich in diversen Beispielen aber auch innerhalb von MySQL komplexere Abfragen, die zum Beispiel auch mit Bedingungen und loops arbeiten. Von daher könnte ich mir immer noch vorstellen, das auch eine reine MySQL-Lösung denkbar sein müsste.

Wer weis was?

gma
 
Du kannst mittels INSERT INTO ... SELECT FROM ... durchaus direkt die Ergebnisse eines Selects in eine andere Tabelle schreiben. Die muss es dann aber schon geben.
 
Mein erster Gedanke wäre es über eine Differenz oder so zu machen. Also wenn du von der Gesamtheit jeweils die untere Grenze abziehst und dann ein kleiner auf die obere Grenze überprüfst, dann kannst du entsprechende Prädikate formulieren.

Beispiel:

Zahl 5
Bereich 1-9

5-1 (untere Grenze) = 4 --> kleiner (9-1)=8 , innerhalb Intervall

Zahl 8
Bereich 2-4
8-2 (untere Grenze) = 6 > (4-2) = 2, nicht innerhalb Bereich

Ich hab die Logik nicht voll durchdacht, aber ich löse Intervalle immer so auf ;-)
 
Zuletzt bearbeitet:
Wenn Du's mit nem LOOP machen magst, könntest Du soetwas machen:
Code:
SET i=0;

WHILE i<SELECT COUNT(*) FROM position DO
   SELECT * FROM referenz WHERE position BETWEEN (SELECT von FROM auswahl LIMIT i,1) AND (SELECT bis FROM auswahl LIMIT i,1);
   SET i=i+1;
END WHILE

In etwa zumindest…

EDIT: s. Post 12
 
Zuletzt bearbeitet:
Wenn Du's mit nem LOOP machen magst, könntest Du soetwas machen:
Code:
SET i=0;

WHILE i<SELECT COUNT(*) FROM position DO
   SELECT * FROM referenz WHERE position BETWEEN (SELECT von FROM auswahl LIMIT i,1) AND (SELECT bis FROM auswahl LIMIT i,1);
   SET i=i+1;
END WHILE

In etwa zumindest…


hört sicht gut an, ich werde mich mal dran setzen, danke nochmal
 
Du kannst mittels INSERT INTO ... SELECT FROM ... durchaus direkt die Ergebnisse eines Selects in eine andere Tabelle schreiben. Die muss es dann aber schon geben.

create table select tut aber genau das, wenn ich dich nicht falsch verstanden haben sollte
 
Ich hab das, im Zussamenspiel mit einem direkten CREATE, noch nie versucht. Möglich, dass auch das geht.
 
Hey, das ganze hat mir keine Ruhe gelassen. Hab's eben nochmal probiert und es ist so einfach!

Code:
SELECT DISTINCT r.position, r.inhalt FROM referenz r, auswahl a
WHERE position > von-1 and position < bis+1
ORDER BY position

Ich bin nur nicht auf einen Join mit Ungleichheitszeichen gekommen.

Meine Tables:
Code:
-- 
-- Table structure for table `auswahl`
-- 

CREATE TABLE `auswahl` (
  `id` int(11) NOT NULL auto_increment,
  `von` int(11) NOT NULL,
  `bis` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- 
-- Dumping data for table `auswahl`
-- 

INSERT INTO `auswahl` VALUES (1, 2, 4);
INSERT INTO `auswahl` VALUES (2, 7, 11);

-- --------------------------------------------------------

-- 
-- Table structure for table `referenz`
-- 

CREATE TABLE `referenz` (
  `position` int(11) NOT NULL,
  `inhalt` char(1) NOT NULL,
  PRIMARY KEY  (`position`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- 
-- Dumping data for table `referenz`
-- 

INSERT INTO `referenz` VALUES (1, 'a');
INSERT INTO `referenz` VALUES (2, 'b');
INSERT INTO `referenz` VALUES (3, 'c');
INSERT INTO `referenz` VALUES (4, 'd');
INSERT INTO `referenz` VALUES (5, 'e');
INSERT INTO `referenz` VALUES (6, 'f');
INSERT INTO `referenz` VALUES (7, 'g');
INSERT INTO `referenz` VALUES (8, 'h');
INSERT INTO `referenz` VALUES (9, 'i');
INSERT INTO `referenz` VALUES (10, 'j');
INSERT INTO `referenz` VALUES (11, 'k');
INSERT INTO `referenz` VALUES (12, 'l');
INSERT INTO `referenz` VALUES (13, 'm');
INSERT INTO `referenz` VALUES (14, 'n');
INSERT INTO `referenz` VALUES (15, 'o');
INSERT INTO `referenz` VALUES (16, 'p');
 
Code:
SELECT DISTINCT r.position, r.inhalt FROM referenz r, auswahl a
WHERE position > von-1 and position < bis+1
ORDER BY position

Code:
SELECT DISTINCT r.position, r.inhalt FROM referenz r, auswahl a
WHERE position BETWEEN von AND bis
ORDER BY position

Sollte das selbe Ergebnis bringen.
 
Code:
SELECT DISTINCT r.position, r.inhalt FROM referenz r, auswahl a
WHERE position BETWEEN von AND bis
ORDER BY position

Sollte das selbe Ergebnis bringen.

vielen Dank. Wie ich gerade feststellen musste braucht man weder einen loop noch das distinct.

Verstehe ich aber nicht, woher weiß denn MySQL welches VON und welches BIS (ich meine aus welcher Zeile), oder werden alle Kombinationen getestet?


gma

übrigens: was bedeutet das "distinct" denn überhaupt?
 
Distinct macht aus der Multimenge wieder eine Menge, sprich entfernt alle doppelten Einträge...
 
Zurück
Oben Unten