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

MySQL - In der Zeile multiplizieren wenn...

Frage Entwicklung Datenbanken

Mitglied: EvilMoe

EvilMoe (Level 2) - Jetzt verbinden

09.08.2008, aktualisiert 11.08.2008, 5871 Aufrufe, 7 Kommentare

Hallo

Ich stecke gerade bei eine SQL Abfrage fest.

01.
 
02.
SELECT COUNT(imgID) as anz, images.id, images.server as server, fsize_image, fsize_thumb,views.form  
03.
 
04.
FROM views, images, server 
05.
 
06.
WHERE images.id = imgID 
07.
 
08.
GROUP BY images.id 
09.
 
10.
 
Diese Abfrage liefert ein Ergebnis wie:
0d7020aa04d8bdfc5a26ade7c04fee40-unbenannt - Klicke auf das Bild, um es zu vergrößern


Das Ergebnis ist auch gut. Nun möchte ich allerding "anz" mit "fsize_image" oder "fsize_thumb" muliplizieren je nachdem was bei "form" steht. Wie macht man das?
Mitglied: Biber
09.08.2008 um 19:03 Uhr
Moin EvilMoe,

versuche es so:
01.
SELECT COUNT(imgID) as anz, images.id, images.server as server,  
02.
fsize_image, fsize_thumb,views.form, 
03.
CASE when view.form = 'image' then fsize_image * Count(imgID) 
04.
CASE when view.form = 'thumb' then fsize_thumb * Count(imgID) 
05.
Else 0 
06.
End CASE as WholeFSize 
07.
 
08.
FROM views, images, server 
09.
WHERE images.id = imgID 
10.
GROUP BY images.id
Grüße
Biber
[Wobei ich nur die CASE-Mimik hier einbauen wollte.
Die Query selbst ist mir nicht klar (auch nicht, warum sie funktioniert). Wozu wird die Tabelle "server" angefasst?
In welche Tabelle stehen die "fsize_*"-Felder?]

[Edit] Tippfehlerkorrektur "End CASE as WholeFSize" siehe unten. [/Edit]
Bitte warten ..
Mitglied: EvilMoe
09.08.2008 um 19:24 Uhr
Abend,

in den "Case" Anweisungen müsste es "views" heißen, aber da sist ja nebensache. Ich erhalte trotzdem einen SQL Syntax Fehler.

01.
 
02.
SELECT COUNT(imgID) as anz, images.id, images.server as server,  
03.
fsize_image, fsize_thumb,views.form, 
04.
CASE when views.form = 'image' then fsize_image * Count(imgID) 
05.
CASE when views.form = 'thumb' then fsize_thumb * Count(imgID) 
06.
Else 0 
07.
End as WholeFSize 
08.
 
09.
FROM views, images 
10.
WHERE images.id = imgID 
11.
GROUP BY images.id 
12.
 
PS: Stimmt, die Tabelle "server" brauche ich gar nicht weil ich die "serverID" aus der Tabelle von "images" hole. Hab’s bei mir auch gleich entfernt.

Die "fsize_*" Felder befinden sich in der "image" Tabelle.


Warum ist der Query nicht klar? Hab ich einen Denkfehler? Ich sag einfach mal worum es geht vielleicht wird’s dann klarer was ich erreichen möchte.


Ich habe 3 Tabellen. "images, server, views"

In "server" befinden sich Daten zu einzelnen Hosts die ich aber hierfür nicht brauche. In "images" sind alle Daten der Bilder erfasst die dort gespeichert sind. Und "views" sind alle aufrufe der Bilder gespeichert.

Nun möchte ich dadurch erreichen das meine Hosts "gleichmäßig" belastet werden. Darum wollte ich aus den „views“ die verbrauchte Bandbreite der letzten Stunde errechnen und sortieren damit die neuen Bilder auf den Host kommen der am wenigsten ausgelastet ist.

Ich das vorhaben überhaupt so richtig? Oder gibt es dafür vielleicht sogar eine elegantere Methode um die Last (Bandbreite) zu verteilen?
Bitte warten ..
Mitglied: Biber
09.08.2008 um 19:31 Uhr
Moin EvilMoe,

okay, der Syntaxfehler kommt sicherlich, weil mySQL am Ende der CASE-Anweisung ein "END CASE" erwartet und nicht nur ein "END".

Sorry für die Flüchtigkeitsfehler.

Grüße
Biber
Bitte warten ..
Mitglied: EvilMoe
09.08.2008 um 19:39 Uhr
Nee klappt trotzdem nicht.


Fehler:
01.
 MySQL meldet: Dokumentation 
02.
#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 'CASE when views . form = 'thumb' then fsize_thumb * Count( imgID )  Else 0  End ' at line 1 
03.
 
Hast du dir mein Vorhaben durchgelesen und könnte man das so machen?
Bitte warten ..
Mitglied: Biber
09.08.2008 um 19:53 Uhr
Moin EvilMoe,

menno, ich lass jetzt mal besser die Finger von der Tastatur...*grmpf*

Ich habe es jetzt nun doch mal nachgelesen im Handbuch und die Syntax ist nun noch anders....

Aber da ich es selber nicht Testen kann, ist es eventuell besser, Du tippst es selbst ab...?

Zum Vorhaben kann ich nichts sagen, weil...
entweder habe ich eine Denkblockade oder die Anz (Anzahl der Images) ist vollkommen irrelevant. IMHO steht die Gesamtgröße (die fsize_*'s) doch in der Images-Tabelle... und dort sollte images.id doch der PK sein.... und von daher ist auch die Multiplikation mit einer Image-Anzahl Bullshit....

Ich mach mal Pause und überlasse den anderen das Feld..

Sorry
Biber
Bitte warten ..
Mitglied: EvilMoe
09.08.2008 um 20:06 Uhr
"Anz" ist nicht die Anzahl der Bilder sondern die Anzahl der aufrufe des Bildes.

Habe mir die Doku angeguckt und nun schauts so aus (noch leicht verändert).

Jetzt nur noch "eine Kleinigkeit". Wie kann ich jetzt alles zusammenfassen? Also das ich nur noch einmal "server" mit der "id" 1 vorkommt aber die errechneten Werte (WholeFsize) addiert werden. Und die Server die garnicht vorkommen (brauche doch noch die Tabelle "server") ganz vorne stehen (ORDER BY WholeFsize). Das ist doch wieder was mit "LEFT JOIN" oder?

01.
SELECT images.id, images.server as server, 
02.
CASE when views.form = 'image' then fsize_image * Count(imgID) 
03.
Else fsize_thumb * Count(imgID) 
04.
End as WholeFSize 
05.
 
06.
FROM views, images 
07.
WHERE images.id = imgID 
08.
GROUP BY images.id
Bitte warten ..
Mitglied: Biber
11.08.2008 um 06:51 Uhr
Moin EvilMoe,
"Anz" ist nicht die Anzahl der Bilder sondern die Anzahl der aufrufe des Bildes.
*sichvornKoppKlatsch*... das meinte ich mit Denkblockade...
Okay, jetzt macht es etwas mehr Sinn...

Angenommen, in der Tabelle "server" gibt es auch ein Feld "id", dessen Wert wiederum dem Feld "server" der images-Tabelle entspricht..

Ich würde Abfrage aus Gründen der Übersichtlichkeit und Peeformance statt mit LEFT JOIN eher mit UNION machen.
Ich nehme es ungern in Kauf, wenn bei einem LEFT JOIN natürlicherweise auch Felder NULL sein können und in irgendeiner CASE-Anweisung dann diese NULL-Felder miteinander multiplziert werden...in so einem fipsigen Statement wie Deinem findet man/frau sowas ja noch schnell, aber in längeren Statements sollte so etwas zumindest nicht schon im ersten Entwurf hingenommen werden.

01.
Select * from ( 
02.
SELECT  
03.
i.server as server,  
04.
i.id as imageid,  
05.
CASE WHEN v.form = 'image'  
06.
         THEN i.fsize_image * Count(v.imgID) 
07.
         ELSE i.fsize_thumb * Count(v.imgID) 
08.
End as WholeFSize 
09.
FROM views v, images i 
10.
WHERE i.id = v.imgID 
11.
GROUP BY i.id 
12.
union  
13.
select server.id as server, NULL as imageid, NULL as Wholesize 
14.
from server 
15.
WHERE Server.id not in (select distinct Server from images) 
16.
17.
order by server
[wie immer ungetestet runtergetippt]
Die "AS server", "AD imageid" usw sind überflüssig bzw nur für die Les- und Wartbarkeit.

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Internet Domänen
Weiterleitung wenn Domain nicht erreichbar (8)

Frage von BAMA1971 zum Thema Internet Domänen ...

Hardware
gelöst Servergehäusenetzteile zischen, wenn nicht unter Last - normal? (5)

Frage von DerWoWusste zum Thema Hardware ...

Tipps & Tricks
Wenn die Sophos außer Betrieb ist (17)

Frage von Hendrik2586 zum Thema Tipps & Tricks ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...