Hallo,
ich beiße mir im Moment die Zähne an einer Abfrage aus oder steh einfach aufm Schlauch....oder beides.
Folgendes:
Ich habe eine Tabelle (vereinfacht):
Code:
id, titel, titel_id, ext_id, ext_wert, wert
1, Test 1, T_11, 11_3, 3.99, 8.99
2, Titel 1, T_11, 21_3, 2.99, 9.99
3, Test Titel 1, T_11, 31_3, 3.49, 10.99
4, Test 2, T_21, 11_3, 4.29, 7.99
5, Titel 2, T_21, 41_4, 3.99, 9.99
6, Titel 3, T_31, 31_3, 2.99, 8.99
Auf der Seite können beliebig viele Titel ausgewählt werden, daraufhin sollen die 5 Kombinationen angezeigt werden in denen die Summe von Wert + je ext_id der Höchste ext_wert summiert am geringsten ist.
Folgende Ausgabe wäre korrekt:
Code:
a_id, a_titel, a_ext_id, a_ext_wert, a_wert, b_id, b_titel, b_ext_id, b_ext_wert, b_wert, ges_wert
1, Test 1, T_11, 11_3, 3.99, 8.99, 4, Test 2, T_21, 11_3, 4.29, 7.99, 21.27
2, Titel 1, T_11, 21_3, 2.99, 9.99, 5, Titel 2, T_21, 41_4, 3.99, 9.99, 25.26
3, Test Titel 1, T_11, 31_3, 3.49, 10.99, 4, Test 2, T_21, 11_3, 4.29, 7.99, 26,76
Usw…
Mein Problem dabei ist die MAX werte von ext_wert nach ext_id Gruppiert zu Summieren.
Bisher habe ich diesen Teil per PHP gelöst, da war meine Test DB aber auch noch sehr klein (ca. 100 Datensätze) ich rechne mit mehreren 100.000 Datensätzen und habe die DB deshalb vor kurzem aufgebläht auf ca. 65.000 Datensätze.
Da ich die Kombinationen mit einer Variablen Anzahl CROSS JOINS gelöst habe war mir klar das es bei sovielen Datensätzen wohl sehr langsam werden wird, nach dem "aufblähen" der Datenbank hat mein PHP Script auch sehr schnell gestreikt (Out of Memory), seit dem Versuche ich alles in einer Abfrage zu erledigen.
Einer meiner Ansätze war der folgende (der Teil in dem ich die werte dazu Addiere fehlt hier noch, wird aber kein Problem darstellen):
Code:
SELECT
SUM(max_ext_wert) AS ges_ext_wert, a.id AS a_id, a.titel_id AS a_titel_id,
a.wert AS a_wert, a.ext_wert AS a_ext_wert, a.ext_id AS a_ext_id, b.id AS b_id,
b. titel_id AS b_ titel_id, b. wert AS b_ wert, b. ext_wert AS b_ ext_wert,
b. ext_id AS b_ ext_id
FROM (table AS a CROSS JOIN table AS b) LEFT JOIN
(SELECT MAX(ext_wert) AS max_ext_wert, id, ext_id
FROM table GROUP BY ext_id) AS summe
ON summe.id = a.id OR summe.id = b.id
where a. titel_id = 't_11' and b. titel_id = 't_21'
LIMIT 5
Bei dieser Variante wird mir nur 1 Datensatz angezeigt (vermutlich wegen dem SUM() ), in dem max_ext_wert leer ist. Der ON bezug scheint nicht korrekt zu sein, wenn ich den Alias a_id nutze kann die Spalte nicht gefunden werden.
Eine Andere Variante, die mir einfällt wäre die daten aus den x_ext_id und x_ext_wert Spalten je eine Spalte zu packen und diese dann zu Gruppieren etc. Jedoch habe ich noch keine möglichkeit gefunden das zu tun.
Die Daten kommen aus mehreren CSV-Dateien die ich nicht beeinflussen kann und auch bei gleicher titel_id einen anderen titel haben können, desshalb habe ich diese Daten in eine Tabelle gesteckt und die Tabelle erstmal nicht aufgeteilt.
Ich bin für jeden Ansatz dankbar, ich weiss das die CROSS JOINS viel Rechenleistung fordern werden bei der Menge an Daten, wenn also jemand eine Lösung weiss die Performanter ist gerne her damit.