maik87
Goto Top

MySQL - dynamisches between aus Tabelle erstellen

Hallo Forum,

ich habe folgendes vor:
Ich habe eine Tabelle "TabBetw". In der sind Zahlenbereiche in den Spalten Von und Bis eingetragen.

TabBetw
Von Bis
1 4
10 50
100 102


Jetzt möchte ich aus einer weiteren Tabelle "Daten" alle Zeilen auslesen, die in den og. Zahlenbereichen sind:
Mein (nicht funktionierender) Denkansatz ist wie folgt:

Select * from daten where id between (select a.von from TabBetwe a) and (select b.bis from TabBetwe b)

Das funktioniert jetzt aber nur für die erste Zeile. Wie erreiche ich, dass alle Zeilen dabei beachtet werden?


Ich hoffe, ihr versteht was ich meine.


Danke schön bereits im Voraus!!

Content-Key: 177203

Url: https://administrator.de/contentid/177203

Printed on: April 20, 2024 at 00:04 o'clock

Member: nxclass
nxclass Dec 03, 2011 at 14:01:13 (UTC)
Goto Top
versuch das mal:
SELECT b.*, d.*
FROM `betw` b
    LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )
Member: Maik87
Maik87 Dec 03, 2011 at 16:38:52 (UTC)
Goto Top
Super!! Danke!!

Wenn ich das b.* weglasse, läuft es so wie es soll!
Kannst mir bitte noch erklären, wie der Code funktioniert?
Member: nxclass
nxclass Dec 04, 2011 at 23:16:02 (UTC)
Goto Top
Einfach: die Daten der Tabellen 'betw* und *dat* werden verknüpft - hinter ON steht dann nur Wie diese verbunden sind.
Member: Maik87
Maik87 Dec 05, 2011 at 16:05:22 (UTC)
Goto Top
Ich verzweifel mal wieder an der Steigerung:

> SELECT t.ID2, count(*)
> FROM tabelle t
> WHERE t.ID
> NOT IN(SELECT  d.ID
> FROM `betw` b
>     LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` ))
> GROUP BY t.ID2
> 

Funktioniert ja noch...
Aus Tabelle t werden die ID2 und die jeweiligen Anzahlen ausgegeben, die nicht durch den "Between-Join" ausgegrenzt wurden.

Wie schaffe ich es jetzt aber, diese gezählten Daten per Update in eine weitere Tabelle zu packen?
t2
ID2 Anzahl
5 10
6 7

sowas in der Art wie
> UPDATE tabelle2 t2
> SET t2.id2 = t.count(*)
> ...
> WHERE t2.id2 = t.ID2  
Member: Biber
Biber Dec 05, 2011 at 16:54:48 (UTC)
Goto Top
Moin maik87,

bist du dir sicher, dass du eine Tabelle UPDATEn willst - meinst du nicht das komplette Neubefüllen einer neuen/leeren Tabelle per INSERT INTO?

So in der Art:
 INSERT INTO tabelle2 ( id,  Anzahl) 
SELECT t.ID2, count(*)
 FROM tabelle t
 WHERE t.ID
 NOT IN(SELECT  d.ID
 FROM `betw` b
     LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` ))
 GROUP BY t.ID2

Grüßr
Biber
Member: Maik87
Maik87 Dec 05, 2011 at 17:23:36 (UTC)
Goto Top
Moin Biber,

danke für deine Antwort.

Ich muss leider Updaten, weil die entsprechenden Datensätze schon in der Tabelle vorhanden sind und nur um diese Info ergänzt werden sollen/müssen.

Grüße
Maik87
Member: Biber
Biber Dec 05, 2011 at 17:37:43 (UTC)
Goto Top
Moin Maik87,

da komm ich aber gedanklich nicht ganz mit..
Du schriebst doch " UPDATE tabelle2 t2 SET t2.id2 = t.count(*) ..." --> würde für mich heißen, die ermittelte Anzahl aus dem "alle Ids außerhalb der Between-Grenzen"-Statenment werden zur (neuen) ID ???

Oder aber... FALLS die Tabelle t2 zwei (oder mehr) Felder enthielte, unter anderem "ID" und "Anzahl" und du wolltest "Anzahl" updaten...
-> du würdest doch immer nur die Sätze updaten, bei denen du Treffer hast.

Sätze, in denen vorher die ID 4711 und die Anzahl 42 drin stand, werden doch nicht mit Anzahl=0 upgedatet,falls kein Treffer mehr da ist.
Die bleiben immer auf ihrem Wert 42 kleben.

Ich versteh das Ziel bzw. den Informationsgehalt der Tabelle t2 überhaupt nicht.

Was ist denn der Plan?

P.S. Vielleicht liegt es ja auch am Wochentag- an Tagen mit einem "t" im Namen bin ich meist etwas langsamer.

Grüße
Biber
Member: Maik87
Maik87 Dec 05, 2011 at 17:55:26 (UTC)
Goto Top
Moin Biber,

ich fang mal von vorne an und hoffe, dass es verständlich ist.

Wir haben im System eine Hierarchie von Abteilungen. Du kannst sie dir wie eine Ordnerhierarchie auf der Festplatte vorstellen. Die eine Ebene beinhaltet die andere Ebene. Jede Abteilung hat nun eine vom System vorgegebene, eindeutige ID. Damit es für das menschliche Auge einfacher ist, gibt es neben dieser ID noch eine weitere ID, die so aufgebaut ist, dass jede Ebene zwei Stellen in der ID hat. Sprich erste Ebene beginnt mit 13, alles was darunter liegt bekommt die 13* usw.

Meine Tabelle "dat" ist eine Brückungstabelle. Sie brückt die "menschliche" ID zu der automatisch generierten vom System. Die Tabelle "betw" stellt nur eine Ausschlusstabelle dar, in der Bereiche der "menschlichen" ID ausgrenzt werden. Diese müssen aber, um im System damit arbeiten zu können, auf die automatische gebrückt werden.

Aus dieser Kombination ermittel ich erstmal die Zeilen aus einer Tabelle, die überhaupt in Frage kommen, nehmen dann die ID2 (Personalnummer Vorgesetzter) und zähle dann dessen vorkommen. Damit ermittel ich die Anzahl der direkt unterstellten Mitarbeiter:
>SELECT t.ID2, count(*) 
>FROM tabelle t 
>WHERE t.ID 
>NOT IN(SELECT  d.ID 
>FROM `betw` b 
>LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )) 

Jetzt habe ich eine weitere Tabelle. In der sind viele viele Personen vorhanden. An diese Tabelle möchte ich nun die Anzahl der unterstellten Mitarbeiter dranschreiben. Ein Insert scheidet definitiv dabei aus.

Hast du verstanden was ich meine??
Member: Biber
Biber Dec 05, 2011 at 18:13:52 (UTC)
Goto Top
Moin Maik87,

ich sach mal so - wenn die oben von dir gepostete Abfrage die richtigen bzw. die passenden Werte zurückgibt, [nach deiner Aussage so: ]
SELECT t.ID2, count(*) 
FROM tabelle t 
WHERE t.ID 
      NOT IN( 
                       SELECT  d.ID 
                      FROM `betw` b 
                       LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )
                    ) 
Group by t.ID2

--> dann müsste doch das Update-Statement so aussehen
UPDATE Tabelle t2 Join   ( 
                                     SELECT t.ID2, count(*) as AnzNotBetween
                                          FROM tabelle t 
                                    WHERE t.ID 
                                   NOT IN( 
                                          SELECT  d.ID 
                                              FROM `betw` b 
                                          LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )
                                       ) 
                                    Group by t.ID2
                                   )  tabNotBetween  ON t2.id2=TabNotBetween.ID2
  set t2.Anzahl =   TabNotBetween.AnzNotBetween

---> Ist aber alles reiner jugendlicher Übermut und ungetestet.

Bitte nicht sofort auf produktive Daten anwenden.

Grüße
Biber
Member: Maik87
Maik87 Dec 05, 2011 at 18:22:23 (UTC)
Goto Top
Hey Biber,

ja, die erste Abfrage liefert definitiv die richtigen Werte.

Ich werde dein Statement morgen einmal testen. Habe jetzt die Daten nicht zur Hand...
Auf den ersten Blick sieht es sehr gut aus. Ich glaub ich kann einfach nicht so krumm denken, wie es manchmal sein müsste.

Danke schonmal. Ich melde mich morgen früh. Hoffe, dass nun die Probleme soweit durch sind ;)
Member: Maik87
Maik87 Dec 06, 2011 at 07:37:50 (UTC)
Goto Top
Moin Biber,

es läuft =)

Daaaanke!!!