evilmoe
Goto Top

MySQL - In der Zeile multiplizieren wenn...

Hallo

Ich stecke gerade bei eine SQL Abfrage fest.

SELECT COUNT(imgID) as anz, images.id, images.server as server, fsize_image, fsize_thumb,views.form 

FROM views, images, server

WHERE images.id = imgID

GROUP BY images.id

Diese Abfrage liefert ein Ergebnis wie:
0d7020aa04d8bdfc5a26ade7c04fee40-unbenannt


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?

Content-Key: 94025

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

Printed on: April 18, 2024 at 23:04 o'clock

Member: Biber
Biber Aug 09, 2008 at 17:03:30 (UTC)
Goto Top
Moin EvilMoe,

versuche es so:
SELECT COUNT(imgID) as anz, images.id, images.server as server, 
fsize_image, fsize_thumb,views.form,
CASE when view.form = 'image' then fsize_image * Count(imgID)  
CASE when view.form = 'thumb' then fsize_thumb * Count(imgID)  
Else 0
End CASE as WholeFSize

FROM views, images, server
WHERE images.id = imgID
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]
Member: EvilMoe
EvilMoe Aug 09, 2008 at 17:24:46 (UTC)
Goto Top
Abend,

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

SELECT COUNT(imgID) as anz, images.id, images.server as server, 
fsize_image, fsize_thumb,views.form,
CASE when views.form = 'image' then fsize_image * Count(imgID)  
CASE when views.form = 'thumb' then fsize_thumb * Count(imgID)  
Else 0
End as WholeFSize

FROM views, images
WHERE images.id = imgID
GROUP BY images.id

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?
Member: Biber
Biber Aug 09, 2008 at 17:31:47 (UTC)
Goto Top
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
Member: EvilMoe
EvilMoe Aug 09, 2008 at 17:39:53 (UTC)
Goto Top
Nee klappt trotzdem nicht.


Fehler:
 MySQL meldet: Dokumentation
#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 

Hast du dir mein Vorhaben durchgelesen und könnte man das so machen?
Member: Biber
Biber Aug 09, 2008 at 17:53:06 (UTC)
Goto Top
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
Member: EvilMoe
EvilMoe Aug 09, 2008 at 18:06:32 (UTC)
Goto Top
"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?

SELECT images.id, images.server as server,
CASE when views.form = 'image' then fsize_image * Count(imgID)  
Else fsize_thumb * Count(imgID)
End as WholeFSize

FROM views, images
WHERE images.id = imgID
GROUP BY images.id
Member: Biber
Biber Aug 11, 2008 at 04:51:27 (UTC)
Goto Top
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.

Select * from (
SELECT 
i.server as server, 
i.id as imageid, 
CASE WHEN v.form = 'image'   
         THEN i.fsize_image * Count(v.imgID)
         ELSE i.fsize_thumb * Count(v.imgID)
End as WholeFSize
FROM views v, images i
WHERE i.id = v.imgID
GROUP BY i.id
union 
select server.id as server, NULL as imageid, NULL as Wholesize
from server
WHERE Server.id not in (select distinct Server from images)
)
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