Einzelnen Beitrag anzeigen
  #2 (permalink)  
Alt 16-06-2016, 06:29
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 452
mermshaus wird schon bald berühmt werden
Standard

Das grundsätzliche Problem ist: Wenn für ein Produkt mehrere Preise existieren, du aber nach Produkt-ID gruppierst (also einen Datensatz pro Produkt hast), welcher Preis soll für das entsprechende Produkt dann gewählt werden?

Ohne ONLY_FULL_GROUP_BY (Standardwert in MySQL vor Version 5.7.5, glaube ich) passiert in dem Fall das:

Zitat:
The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate.
- https://dev.mysql.com/doc/refman/5.5...-handling.html

Anders gesagt: Das DBMS wählt einen der Preise, ohne dass festgelegt ist, nach welcher Logik das passiert.

Wenn du nun…

Code:
GROUP BY product.productID, price.productPrice
…schreibst, gruppierst du nach der Kombination aus Product-ID und Preis. Das heißt, dass du – bei verschiedenen Preisen für ein Produkt – für jede Kombination aus Product-ID und Preis einen Datensatz erhältst. Ein Produkt kann also bei deiner Zufallsauswahl öfter als einmal (mit verschiedenen Preisen) im Resultat auftauchen. In der Beziehung unterscheidet sich deine veränderte Query von deiner Original-Query.

Besser wäre es vermutlich, wenn du weiterhin nur nach Product-ID gruppierst und dem DBMS mitteilst, welchen Preis du haben möchtest, falls verschiedene für ein Produkt existieren. Dazu gibt es die Aggregat-Funktionen.

- MySQL :: MySQL 5.7 Reference Manual :: 13.20.1 GROUP BY (Aggregate) Function Descriptions

In deinem Fall wären wohl der niedrigste oder der höchste Preis sinnvoll (MIN() oder MAX()).

Code:
SELECT product.*, MIN(price.productPrice)
FROM product_list product
LEFT JOIN product_price price ON (price.productID=product.productID) 
WHERE product.inactive = '0'
GROUP BY product.productID
ORDER BY rand()
LIMIT 0, 10
Wenn du es noch etwas eleganter machen möchtest, kannst du dir dazu noch COUNT DISTINCT der Preise liefern lassen und in der Ausgabe ein „ab“ vor dem Preis hinzufügen, wenn der Wert größer als 1 ist.

Code:
SELECT product.*, MIN(price.productPrice), COUNT(DISTINCT price.ProductPrice) AS pricesCount
Mit Zitat antworten