MySQL Frage zur Gruppierung

baserider

Well-known member
ID: 174417
L
10 März 2007
682
23
Code:
SELECT 
	v.produkt_1,
        v.produkt_2, 
        p.hersteller, 
        p2.hersteller, 
        COUNT(*) as anzahl
FROM 
	vergleich v
INNER JOIN 
        produkte p on p.name = v.produkt_1 
INNER JOIN 
        produkte p2 on p2.name = v.produkt_2
WHERE 
        p.hersteller = p2.hersteller
AND 
        p.hersteller = 'Dell'
GROUP BY 
        CONCAT(produkt_1,produkt_2)
ORDER BY 
        anzahl DESC
LIMIT 0,5

Mit dieser Abfrage bekomme ich die Anzahl der miteinander verglichenen Produkte von einem Hersteller, geordnet nach Anzahl. Die ersten 5 Datensätze (am meisten miteinander verglichen) werden ausgegeben, jedoch nur von diesem einen Hersteller.
Ist es möglich nicht auf den Hersteller einzugrenzen und dann jeweils zu allen Herstellern diese 5 Datensätze zu bekommen? Es sollte so aussehen:

produkt | produkt | hersteller1
produkt | produkt | hersteller1
produkt | produkt | hersteller1
produkt | produkt | hersteller1
produkt | produkt | hersteller1
produkt | produkt | hersteller2
produkt | produkt | hersteller2
produkt | produkt | hersteller2
produkt | produkt | hersteller2
produkt | produkt | hersteller2

usw...
 
Du hast scheinbar nen schlechtes DB Schema dafür auf dem Du wohl arbeiten musst.
Ist das das noch MySQL oder Sybase ?

Ich versuche mal zu sagen was du machst.
2 Produkte von einem Hersteller vergeleichen, mit gleichem Produktnamen ?

Könnte man sicher anders gestalten die Abfrage
 
Hi,

arbeite mit MySQL (wie auch im Titel ersichtlich).
Nein es sollen natürlich nicht 2 gleiche Produkte verglichen werden, das würde wenig Sinn machen. Immer 2 unterschiedliche Produkte eines Herstellers
 
Falls es jemand interessiert, hier meine Lösung. Funktioniert zumindest unter MySQL 5. Ich sortiere nach Anzahl und gebejeweils nur die 5 höchsten Werte aus. Mit Limit funktioniert es ja nicht, weil das für die gesamte Tabelle gilt. So kann ich ein Limit gruppenweise angeben.

Code:
set @hersteller = '';
set @Counter = 0;

SELECT t.* FROM (

            SELECT
                produkt_1,
                produkt_2,
                p.hersteller,
            FROM
                vergleich v
            INNER JOIN produkte p on p.pname = v.produkt_1
            INNER JOIN produkte p2 on p2.pname = v.produkt_2
            WHERE p.hersteller = p2.hersteller
            GROUP BY produkt_1,produkt_2
            ORDER BY p.hersteller,COUNT(*) DESC) as t
        HAVING
            IF(
                @hersteller = t.hersteller,
                @Counter := @Counter+1,
                CONCAT(
                    @hersteller := t.hersteller,
                    @Counter := 0
                )
            ) IS NOT NULL
            AND
            @Counter < 5