2012-04-02 5 views
2

Ich habe eine Tabelle namens Produkte mit dem Schema (Name, Stadt, Staat, PLZ Preis).MySQL finden die teuersten in jeder Postleitzahl

Und ich möchte den Namen der teuersten Produkte für einen bestimmten Staat jedes Postleitzahl finden.

Ich schrieb

SELECT zip_code, MAX(price) 
FROM products 
WHERE products.state = 'NJ' 
GROUP BY zip_code 

als Unterabfrage, aber ich konnte nicht herausfinden, Produktnamen und Preis pro zip_code in ‚NJ‘

Anzeige würde ich mich freuen, wenn Sie mir helfen können, Dank .

+0

mögliches Duplikat von [Auswahl der obersten N Zeilen für jede Gruppe in einer Tabelle] (http://stackoverflow.com/questions/3998529/selecting-top-n-rows-for-each-group-in-a-table) –

+0

'SELECT Name, zip_code, MAX (Preis)' ... hat nicht funktioniert? – hjpotter92

+2

@TheJumpingFrog: Das gibt die für 'MAX (Preis) 'relevanten Datensätze nicht zurück, sondern gibt nur einen beliebigen Datensatz aus jeder Gruppe zurück. – mellamokb

Antwort

2
SELECT 
     t.name, t.city, t.zip_code, t.price 
FROM 
     (SELECT zip_code 
       , MAX(price) as price 
     FROM products 
     WHERE state = 'NJ' 
     GROUP BY zip_code 
     ) AS tm 
    JOIN 
     products as t 
      ON tm.zip_code = t.zip_code 
      AND tm.price = t.price 
WHERE 
     t.state = 'NJ' 
+1

@safarov: Warum haben Sie Ihre Antwort gelöscht? –

+0

Ich weiß, @safarov hatte die beste Antwort :) – mellamokb

0

Etwas wie folgt aus:

SELECT name,price,zip_code 
FROM products 
WHERE state='NJ' AND price=(SELECT MAX(price) FROM products) 
+0

aber es muss für jede Postleitzahl sein – CanCeylan

+1

Ich denke, das wird auch nicht helfen. Es wird nur den Namen der max-Preis-Einheit weiterleiten – hjpotter92

3

Dies sollte funktionieren, obwohl ich nicht bürgen dafür Effizienz ist. Pro Kommentar, hier ist ein Update, das alle Datensätze mit Preis gleich dem maximalen Preis pro Postleitzahl zurückzieht.

SELECT * 
    FROM products p1 
WHERE p1.state = 'NJ' 
    AND p1.price = (select max(price) from products p2 
        where p1.zip_code = p2.zip_code) 

http://www.sqlfiddle.com/#!2/98f6d/2

+0

ja, ich denke, es wird funktionieren, aber das einzige Problem ist, ich möchte alle Produkte finden, die Preis ist maximal, nicht nur die oberste – CanCeylan

+0

Righto, aktualisiert, um durch Preis statt von nur der ersten Platte. Obwohl ich denke @ Safarov Lösung ist besser. – mellamokb

0

Ich denke, dass Sie (oder so) ein Composite-Index auf products.state, products.zip_code.

Versuchen Sie Folgendes:

SELECT p.zip_code, MAX(p.price) AS max_price, 
(
    SELECT GROUP_CONCAT(CAST(products.id AS CHAR)) FROM products 
    WHERE products.state = 'NJ' AND 
    products.zip_code = p.zip_code AND products.price = MAX(p.price) 
) AS product_ids 
FROM products p WHERE p.state = 'NJ' GROUP BY p.zip_code ORDER BY NULL 

Hinweis:
GROUP_CONCAT hat eine Begrenzung der maximalen Länge des resultierenden Strings bezüglich finden http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_group_concat_max_len. Wenn Sie einige IDs vermissen, könnte dies der Grund sein.