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, 3122 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 ..
Ähnliche Inhalte
Windows Server
Win2016 - Failovercluster erstellen (4)

Frage von emeriks zum Thema Windows Server ...

Windows Server
gelöst Windows Server 2016 DFS Namespace erstellen auf verschlüsselter Festplatte (6)

Frage von suB2010 zum Thema Windows Server ...

Datenbanken
gelöst MySQL Abfrage für demographische Zwecke (3)

Frage von morphil zum Thema Datenbanken ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(38)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
POS Hardware und alternativen zu Raid 1? (21)

Frage von Brotkasten zum Thema Festplatten, SSD, Raid ...

Viren und Trojaner
Verschlüsselungstrojaner simulieren (15)

Frage von AlbertMinrich zum Thema Viren und Trojaner ...

ISDN & Analoganschlüsse
gelöst Splitter - RJ45 zu RJ11? (14)

Frage von Waishon zum Thema ISDN & Analoganschlüsse ...

Rechtliche Fragen
Hotspot rechtssicher betreiben? (14)

Frage von xSiggix zum Thema Rechtliche Fragen ...