Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MySQL - dynamisches between aus Tabelle erstellen

Frage Entwicklung Datenbanken

Mitglied: Maik87

Maik87 (Level 2) - Jetzt verbinden

03.12.2011, aktualisiert 17:21 Uhr, 3095 Aufrufe, 11 Kommentare

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!!
Mitglied: nxclass
03.12.2011 um 15:01 Uhr
versuch das mal:
01.
SELECT b.*, d.* 
02.
FROM `betw` b 
03.
    LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )
Bitte warten ..
Mitglied: Maik87
03.12.2011 um 17:38 Uhr
Super!! Danke!!

Wenn ich das b.* weglasse, läuft es so wie es soll!
Kannst mir bitte noch erklären, wie der Code funktioniert?
Bitte warten ..
Mitglied: nxclass
05.12.2011 um 00:16 Uhr
Einfach: die Daten der Tabellen 'betw* und *dat* werden verknüpft - hinter ON steht dann nur Wie diese verbunden sind.
Bitte warten ..
Mitglied: Maik87
05.12.2011 um 17:05 Uhr
Ich verzweifel mal wieder an der Steigerung:

01.
> SELECT t.ID2, count(*) 
02.
> FROM tabelle t 
03.
> WHERE t.ID 
04.
> NOT IN(SELECT  d.ID 
05.
> FROM `betw` b 
06.
>     LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )) 
07.
> GROUP BY t.ID2 
08.
> 

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
01.
> UPDATE tabelle2 t2 
02.
> SET t2.id2 = t.count(*) 
03.
> ... 
04.
> WHERE t2.id2 = t.ID2  
Bitte warten ..
Mitglied: Biber
05.12.2011 um 17:54 Uhr
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:
01.
 INSERT INTO tabelle2 ( id,  Anzahl)  
02.
SELECT t.ID2, count(*) 
03.
 FROM tabelle t 
04.
 WHERE t.ID 
05.
 NOT IN(SELECT  d.ID 
06.
 FROM `betw` b 
07.
     LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` )) 
08.
 GROUP BY t.ID2
Grüßr
Biber
Bitte warten ..
Mitglied: Maik87
05.12.2011 um 18:23 Uhr
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
Bitte warten ..
Mitglied: Biber
05.12.2011 um 18:37 Uhr
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
Bitte warten ..
Mitglied: Maik87
05.12.2011 um 18:55 Uhr
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:
01.
>SELECT t.ID2, count(*)  
02.
>FROM tabelle t  
03.
>WHERE t.ID  
04.
>NOT IN(SELECT  d.ID  
05.
>FROM `betw` b  
06.
>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??
Bitte warten ..
Mitglied: Biber
05.12.2011 um 19:13 Uhr
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: ]
01.
SELECT t.ID2, count(*)  
02.
FROM tabelle t  
03.
WHERE t.ID  
04.
      NOT IN(  
05.
                       SELECT  d.ID  
06.
                      FROM `betw` b  
07.
                       LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` ) 
08.
                    )  
09.
Group by t.ID2
--> dann müsste doch das Update-Statement so aussehen
01.
UPDATE Tabelle t2 Join   (  
02.
                                     SELECT t.ID2, count(*) as AnzNotBetween 
03.
                                          FROM tabelle t  
04.
                                    WHERE t.ID  
05.
                                   NOT IN(  
06.
                                          SELECT  d.ID  
07.
                                              FROM `betw` b  
08.
                                          LEFT JOIN `dat` d ON ( d.`id` BETWEEN b.`von` AND b.`bis` ) 
09.
                                       )  
10.
                                    Group by t.ID2 
11.
                                   )  tabNotBetween  ON t2.id2=TabNotBetween.ID2 
12.
  set t2.Anzahl =   TabNotBetween.AnzNotBetween
---> Ist aber alles reiner jugendlicher Übermut und ungetestet.

Bitte nicht sofort auf produktive Daten anwenden.

Grüße
Biber
Bitte warten ..
Mitglied: Maik87
05.12.2011 um 19:22 Uhr
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 ;)
Bitte warten ..
Mitglied: Maik87
06.12.2011 um 08:37 Uhr
Moin Biber,

es läuft =)

Daaaanke!!!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Netzwerkgrundlagen
IPsec - .conf und .secret erstellen aus Gruppe und User (16)

Frage von MaxMLe zum Thema Netzwerkgrundlagen ...

RedHat, CentOS, Fedora
gelöst Erstellen von Desktopverknüpfungen und Anpassung der Taskleiste (2)

Frage von honeybee zum Thema RedHat, CentOS, Fedora ...

Vmware
ESXI Template erstellen (2)

Frage von Phill93 zum Thema Vmware ...

DNS
IPv6 und dynamisches DNS (3)

Frage von ukulele-7 zum Thema DNS ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...