MySQL - In der Zeile multiplizieren wenn...
Hallo
Ich stecke gerade bei eine SQL Abfrage fest.
Diese Abfrage liefert ein Ergebnis wie:
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?
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:
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94025
Url: https://administrator.de/forum/mysql-in-der-zeile-multiplizieren-wenn-94025.html
Ausgedruckt am: 07.01.2025 um 04:01 Uhr
7 Kommentare
Neuester Kommentar
Moin EvilMoe,
versuche es so:
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]
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]
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
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
Moin EvilMoe,
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.
[wie immer ungetestet runtergetippt]
Die "AS server", "AD imageid" usw sind überflüssig bzw nur für die Les- und Wartbarkeit.
Grüße
Biber
"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
Die "AS server", "AD imageid" usw sind überflüssig bzw nur für die Les- und Wartbarkeit.
Grüße
Biber