phpbar.de logo

Mailinglisten-Archive

3-Tabellenproblem

3-Tabellenproblem

gerd gerd at roo.de
Don Feb 8 19:14:01 CET 2007


Am 08.02.2007 um 14:26 schrieb Sebastian Mendel:

> gerd schrieb:
>> Hallo,
>> nach langem Mitlesen hätte ich nun auch mal ein Problem!
>> Vielleicht könnt Ihr mir einen Hinweis geben!
>>
>> Um es gleich zu sagen: es geht nur um "MySQL" und das in den
>> Versionen "4.1.12-standard" im Testsystem und "4.0.23-Max-log" im  
>> Web.
>>
>> Artikel sind über eine Zwischentabelle mit Kategorien verbunden:
>>
>> Artikel <- Zwischentabelle -> Kategorien
>>
>> Jetzt will ich nur die Artikel haben, die mit einem bestimmten Satz
>> von Kategorien verbunden sind: z. B. : 'cat1', 'cat2', 'cat3'

Ich muß noch nachschieben, das ein gesuchter Artikel auch mit mehr  
Kategorien als  'cat1', 'cat2', 'cat3' verbunden sein darf!
Deshalb sehe ich auch die Lösungen mit mehrfacher Tabellenverwendung  
kritisch; die Zahl der Kategorien dürfte typischerweise zwischen 3  
und 6 liegen.

Es werden also alle Artikel gesucht, die mindestens mit den  
Kategorien : 'cat1', 'cat2', 'cat3'  verbunden sind. Alle  Kategorien  
dieser gefundenen Artikel sollen ausgegeben werden .

Da ich die Datensätze in Templates mit inneren Schleifen ausgebe,  
wäre ein solches Ergebnis ideal:

artikel.id   |      kat.name
-------------------------------
       3         |      cat1
       3         |      cat2
       3         |      cat3
       3         |      cat6
       3         |      cat9
       5         |      cat1
       5         |      cat2
       5         |      cat3
       5         |      cat5

Ausgabe z.B.:

artikel: 3
          cat1 | cat2 | cat3 | cat6 | cat9

artikel: 5
          cat1 | cat2 | cat3 | cat5


> ungetestet:
>
> SELECT
> 	`artikel`.*,
> 	COUNT(`atokat`.`kat_id`) AS `anzahl`
> FROM
> 	`artikel`
> LEFT JOIN
> 	`atokat`
> ON
> 	`atokat`.`artikel_id` = `artikel`.`id`
LEFT JOIN
	`kat`
ON
	`atokat`.`kat_id` = `kat`.`id`
AND
	`kat`.`name` IN ('cat1', 'cat2', 'cat3')
> GROUP BY
> 	`artikel`.`id`
> HAVING
	`anzahl` >= 3

Sebastian, ich habe den JOIN zur dritten Tabelle nachgerüstet und die  
Anzahl nur nach unten begrenzt, bekomme aber auch Artikel mit  
vollständig anderen Kategorien ausgegeben!? Die Begrenzung auf  
"`kat`.`name` IN ('cat1', 'cat2', 'cat3')" scheint nicht zugreifen.
>
> davon ausgehend das (atokat.artikel_id, atokat.kat_id) UNIQUE ist

Ja, sehe ich jetzt auch. Muss mindestens bei den COUNT-Lösungen  
erfüllt sein.

Vielleicht will ich auch zuviel für eine Abfrage (ohne Subselect). :-(


Danke für alle Ansätze, weitere sind willkommen!

Gruß Gerd

_______________________________________________
Allgemeine Infos zur Liste: http://www.4t2.com/mysql/
Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de

php::bar PHP Wiki   -   Listenarchive