Hallo Mark,
na wenn ich den SQL so sehe, kann man nur stauen, dass der MySQL Parser da noch durchblickt und etwas Sinnvolles dabei rauskommt. Aber Spaß beiseite, der SQL ist so kaum noch pflegbar. Zudem hast Du in der Gesamtabfrage ebenfalls das GROUP BY Problem mit einigen Spalten. Per Definition müßten alle Spalten (ausser items.Brand ) mit einer Aggregatfunktion versehen werden, also MIN(), MAX(), AVG() oder was auch immer.., ansonsten gibt es eventuell unerwartete Ergebnisse
SELECT
items.ItemNrSupplProduct,
items.attr_special_price as ItemSpecialPrice,
attr_special_from_date,
items.attr_royalties,
invoicelines.OrderQty,
FullPrice,
SUM(FullPrice) AS total,
items.attr_image,
items.ItemNrInt,
items.Parent,
items.ItemNrSuppl,
items.ItemNrSupplProduct,
[...]
GROUP BY items.Brand
HAVING stockValue > '0'
Ein kleiner Hinweis: "stockValue" ist numerisch und wird mit einem String verglichen. Es genügt:
[...]
GROUP BY items.Brand
HAVING stockValue > 0
Weiterhin solles Du bei Gelegenheit die Befehle "||" auf OR und "&&" auf AND umstellen OR und AND sind SQL-Standard. || und && werden von MySQL zwar unterstützt, aber gehören eigentlich eher zur Programmeben.
Die Berechnung mit dem PhysicalStock ist zig-mal vorhanden, dass sollte besser in einen JOIN ausgelagert werden.
[...]
SELECT SUM(items_stock.PhysicalStock)
FROM items_stock
WHERE items_stock.ItemNrInt = items.ItemNrInt
AND (items_stock.locationID = '001' OR items_stock.locationID = '002' )
[...]
Ich denke das Gesamtkonzept des Query ist falsch bzw. das Datenmodell suboptimal. Im ersten Schritt würde ich die ganzen Rechenoperationen erst einmal entfernen und diese in das Programm oder in ein MySQL Stored Procedure verlegen. Das Hauptproblem ist, die Datenmenge aus invoicelines zu reduzieren.
Wie sieht eigentlich der EXPLAIN zu dem Gesamtquery aus?
Grüße
Thomas