weiteren Filter in Statement unterbringen.

mfeske

Benutzer
Beiträge
8
Hallo zusammen,
ich plage mich darum einen weiteren Filter im Statement zu setzen, was mir leider nicht gelingt.

Was bis jetzt funktioniert ist:
SQL:
select t.*,
       (select v.value from scholle_forms_values v where v.field_name = 'vname' and v.ticket_id = t.id) as vname,
       (select v.value from scholle_forms_values v where v.field_name = 'nname' and v.ticket_id = t.id) as nname,
       (select v.value from scholle_forms_values v where v.field_name = 'group' and v.ticket_id = t.id) as tgroup,
       (select v.value from scholle_forms_values v where v.field_name = 'PayTotal' and v.ticket_id = t.id) as PayTotal,
       (select v.value from scholle_forms_values v where v.field_name = 'email' and v.ticket_id = t.id) as email,
       (select v.value from scholle_forms_values v where v.field_name = 'tyear' and v.ticket_id = t.id) as tyear,
       (SELECT v.value FROM `scholle_forms_values` v WHERE v.field_name LIKE 'room' AND v.ticket_id = t.id) as room
from scholle_forms_input t, scholle_forms_values v
where (v.field_name = 'PayTotal' and v.value is not NULL ) and v.ticket_id = t.id;

Ich setzte im php script aber noch eine variable $tyear = 2023 und es sollen jetzt nur noch die ausgegeben werden bei denen tyear = 2023 ist.

Könntet ihr mir da mit der ergänzenden Zeile helfen ?
Gruß
Micha
 
Werbung:
Also erstmal ist deine Syntax ziemlich gruselig. Das mit den Subselects im SELECT-Teil kann man so machen, schöner wären meiner Meinung nach explizite Joins für jedes Attribut (das ist quasi EAV Entity Atribut Value was du da hast). Hat das mit den Subselects einen besonderen Grund?

Dann haben wir wieder das Thema Komma im FROM-Teil, das sollte man nicht mehr machen (seit ca. 20 Jahren oder so). Das ist auch ein Join und zwar bereits der zweite auf das Attribut "PayTotal", also hier doppelt gemoppelt. Auch haben alle Subselects und dieser Join den selben Alias. Das funktioniert zwar hier aber richtig toll ist das auch nicht und kann natürlich zum Problem werden.

tyear wird dann auch kein Problem sein wenn mal aufräumt.
Code:
SELECT    t.*,
        v1.value AS vname,
        v2.value AS nname,
        v3.value AS tgroup,
        v4.value AS PayTotal,
        v5.value AS email,
        v6.value AS tyear,
        v7.value AS room
FROM    scholle_forms_input t
INNER JOIN scholle_forms_values v4
ON        t.id = v4.ticket_id
AND        v4.field_name = 'PayTotal'
INNER JOIN scholle_forms_values v6
ON        t.id = v6.ticket_id
AND        v6.field_name = 'tyear'
LEFT JOIN scholle_forms_values v1
ON        t.id = v1.ticket_id
AND        v1.field_name = 'vname'
LEFT JOIN scholle_forms_values v2
ON        t.id = v2.ticket_id
AND        v2.field_name = 'nname'
LEFT JOIN scholle_forms_values v3
ON        t.id = v3.ticket_id
AND        v3.field_name = 'group'
LEFT JOIN scholle_forms_values v5
ON        t.id = v5.ticket_id
AND        v5.field_name = 'email'
LEFT JOIN scholle_forms_values v7
ON        t.id = v7.ticket_id
AND        v7.field_name = 'room'
WHERE    v6.value = '2013'
 
so sollte es auch gehen. Hoffe das kein Tippfehler drin ist:

Code:
SELECT t.*,
       MAX( IF(v.field_name = 'vname',   v.value, '')) AS vname,
       MAX( IF(v.field_name = 'nname',   v.value, '')) AS nname,
       MAX( IF(v.field_name = 'group',   v.value, '')) AS tgroup,
       MAX( IF(v.field_name = 'PayTotal',v.value, '')) AS PayTotal,
       MAX( IF(v.field_name = 'email',   v.value, '')) AS email,
       MAX( IF(v.field_name = 'tyear',   v.value, '')) AS tyear,
       MAX( IF(v.field_name = 'room',    v.value, '')) AS room
FROM scholle_forms_input t
left JOIN scholle_forms_values v ON t.id = v.ticket_id
GROUP BY v.id
HAVING tyear = '2023';
 
so sollte es auch gehen
Die Aggregat Variante würde ich bei größeren Datenmengen lieber meiden.
Keine Ahnung, was hier bei Filtern wie year=2023 zusammen kommt. Aktuell wenig, im Dezember wahrscheinlich mehr.
schöner wären meiner Meinung nach explizite Joins für jedes Attribut
Ja und bei der Grundstruktur muss man genau darauf achten, was als outer join gemacht wird. Hast Du aber soweit man es von außen beurteilen kann.
 
Vielen Dank @ukulele :) Du hast mir sehr aus der Patsche geholfen, wenn ich ehrlich bin ich bin schon alt und somit der code den ich mir irgendwo mal zusammen geklaubt habe ;-) Ich gelobe Besserung und vielen Dank für die Unterstützung.
 
Werbung:
Ich habe jetzt gerade ein Fragezeichen über dem Kopf.
BerndB und ich haben dir zwei verschiedene Ansätze gegeben, meine Bemerkung
Abgesehen davon das alles was unter t.* fällt natürlich noch ins GROUP BY gehört und v.id vermutlich t.id sein soll.
bezog sich nur auf die von Bernd.

Es sind vermutlich auch noch andere Ansätze denkbar und vermutlich haben beide hier gewählten Varianten Vor- und Nachteile. Ich würde meine Vorgehensweise mal als klassisch, nativ und konservativ beschreiben und denke das man grade als Einsteiger damit besser fährt weil es einfach der Urlogik von SQL entspricht. Man ist natürlich immer auf der Suche nach der eleganteren Lösung wobei das bedeutet wenig Code, gute Lesbarkeit, Geschwindigkeit, etc. vereinen muss.

Mich würde selbst interessieren wie sich Bernds Vorschlag im Punkt Performance gegen meinen schlägt aber nicht so sehr das ich mir jetzt die Mühe machen würde das zu testen :) Du hast vermutlich mit beiden Varianten keine Laufzeit von über einer Sekunde oder?
 
Zurück
Oben