From gerd at roo.de Wed Feb 7 21:17:18 2007 From: gerd at roo.de (gerd) Date: Wed, 7 Feb 2007 21:17:18 +0100 Subject: 3-Tabellenproblem Message-ID: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> 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' Gewünschtes Ergebnis wäre z.B.: artikel.id | kat.name ------------------------------- 3 | cat1 3 | cat2 3 | cat3 5 | cat1 5 | cat2 5 | cat3 So bekomme ich jedenfalls kein Ergebnis: SELECT artikel.id , kat.name FROM artikel INNER JOIN atokat ON atokat.artikel_id = artikel.id INNER JOIN kat ON kat.id = atokat.kat_id WHERE ( kat.name = 'cat1' AND kat.name = 'cat2' AND kat.name = 'cat3' ) ORDER BY artikel.id Danke und Gruß aus Köln Gerd _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From rico at netbreaker.de Thu Feb 8 09:04:38 2007 From: rico at netbreaker.de (Rico Koerner) Date: Thu, 08 Feb 2007 09:04:38 +0100 Subject: 3-Tabellenproblem In-Reply-To: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> Message-ID: <45CAD996.7060906@netbreaker.de> gerd schrieb: > Hallo, Hallo Gerd > SELECT artikel.id , kat.name > FROM artikel > INNER JOIN atokat ON atokat.artikel_id = artikel.id > INNER JOIN kat ON kat.id = atokat.kat_id > WHERE ( kat.name = 'cat1' AND kat.name = 'cat2' AND > kat.name = 'cat3' ) Das ist ein häufiger Denkfehler. Versuchs mal mit: WHERE ( kat.name = 'cat1' OR kat.name = 'cat2' OR kat.name = 'cat3' ) wenn ich mich recht entsinne geht auch ein: WHERE kat.name IN ('cat1', 'cat2', 'cat3') Gruß Rico _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From rico at netbreaker.de Thu Feb 8 09:09:03 2007 From: rico at netbreaker.de (Rico Koerner) Date: Thu, 08 Feb 2007 09:09:03 +0100 Subject: 3-Tabellenproblem In-Reply-To: <45CAD996.7060906@netbreaker.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CAD996.7060906@netbreaker.de> Message-ID: <45CADA9F.60505@netbreaker.de> Rico Koerner schrieb: > Das ist ein häufiger Denkfehler. Versuchs mal mit: > > WHERE ( kat.name = 'cat1' OR kat.name = 'cat2' OR > kat.name = 'cat3' ) Kommando zurück, jetzt hatte ich hier einen Denkfehler, es sollte ja tatsächlich in allen Kategorien gleichzeitig vorhanden sein. Sorry. Rico _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From gerd at roo.de Thu Feb 8 09:16:30 2007 From: gerd at roo.de (gerd) Date: Thu, 8 Feb 2007 09:16:30 +0100 Subject: 3-Tabellenproblem In-Reply-To: <45CADA9F.60505@netbreaker.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CAD996.7060906@netbreaker.de> <45CADA9F.60505@netbreaker.de> Message-ID: <7EE73B24-7E2A-475F-B5AD-B19EF102AE65@roo.de> Am 08.02.2007 um 09:09 schrieb Rico Koerner: > Rico Koerner schrieb: >> Das ist ein häufiger Denkfehler. Versuchs mal mit: >> >> WHERE ( kat.name = 'cat1' OR kat.name = 'cat2' OR >> kat.name = 'cat3' ) > > Kommando zurück, jetzt hatte ich hier einen Denkfehler, es sollte ja > tatsächlich in allen Kategorien gleichzeitig vorhanden sein. > > Sorry. Danke, Rico, das erspart mir die Antwort. ;-) Über das OR aus einer anderen Abfrage, war ich erst auf das Problem gestoßen. Könnte man evtl. das obige OR mit einem Count kombinieren? Also gedanklich: Count artikel >=3 Gruß Gerd _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From rico at netbreaker.de Thu Feb 8 09:30:16 2007 From: rico at netbreaker.de (Rico Koerner) Date: Thu, 08 Feb 2007 09:30:16 +0100 Subject: 3-Tabellenproblem In-Reply-To: <7EE73B24-7E2A-475F-B5AD-B19EF102AE65@roo.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CAD996.7060906@netbreaker.de> <45CADA9F.60505@netbreaker.de> <7EE73B24-7E2A-475F-B5AD-B19EF102AE65@roo.de> Message-ID: <45CADF98.8050609@netbreaker.de> gerd schrieb: > Am 08.02.2007 um 09:09 schrieb Rico Koerner: > > Über das OR aus einer anderen Abfrage, war ich erst auf das Problem > gestoßen. > > Könnte man evtl. das obige OR mit einem Count kombinieren? Also > gedanklich: Count artikel >=3 Die Variante mit IN (Liste) ist hier aber flexibler, falls ich die Anzahl der zu suchenden Kategorien ändert. artikel = 3 mehr kann ja bei der Abfrage nicht rauskommen, sonst wären deine Datenbestände nicht konsistent. Den Gedanken wollte ich auch grad noch nachschieben. Ansonsten würde es wohl auch noch mit einer Variante gehen in der dieselbe Tabelle mehrfach in der Abfrage verwendet wird: SELECT artikel.id , kat.name AS kn1, kat.name AS kn3, kat.name AS kn3 ... WHERE kn1='cat1' AND kn2='cat2' AND kn3='cat3' Wobei dieser deutlich mehr Rechenaufwand bedeutet. Gruß Rico _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From gerd at roo.de Thu Feb 8 09:45:11 2007 From: gerd at roo.de (gerd) Date: Thu, 8 Feb 2007 09:45:11 +0100 Subject: 3-Tabellenproblem In-Reply-To: <45CADF98.8050609@netbreaker.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CAD996.7060906@netbreaker.de> <45CADA9F.60505@netbreaker.de> <7EE73B24-7E2A-475F-B5AD-B19EF102AE65@roo.de> <45CADF98.8050609@netbreaker.de> Message-ID: <40EC0959-692F-4A46-9973-7D3DFB402A05@roo.de> Am 08.02.2007 um 09:30 schrieb Rico Koerner: > gerd schrieb: >> Am 08.02.2007 um 09:09 schrieb Rico Koerner: >> >> Über das OR aus einer anderen Abfrage, war ich erst auf das Problem >> gestoßen. >> >> Könnte man evtl. das obige OR mit einem Count kombinieren? Also >> gedanklich: Count artikel >=3 > > Die Variante mit IN (Liste) ist hier aber flexibler, falls ich die > Anzahl der zu suchenden Kategorien ändert. > > artikel = 3 > mehr kann ja bei der Abfrage nicht rauskommen, sonst wären deine > Datenbestände nicht konsistent. Stimmt. :-( > > Den Gedanken wollte ich auch grad noch nachschieben. Ansonsten > würde es > wohl auch noch mit einer Variante gehen in der dieselbe Tabelle > mehrfach > in der Abfrage verwendet wird: > > SELECT artikel.id , kat.name AS kn1, kat.name AS kn3, kat.name AS kn3 > ... > WHERE kn1='cat1' AND kn2='cat2' AND kn3='cat3' > > Wobei dieser deutlich mehr Rechenaufwand bedeutet. Müsste ich heute abend testen, ich muss jetzt leider weg. Rechenaufwand wäre auf absehbare Zeit kein Problem (<1000 Artikel). Danke und Gruß Gerd _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From technik at auxion.de Thu Feb 8 09:46:28 2007 From: technik at auxion.de (Technik auXion.de) Date: Thu, 8 Feb 2007 09:46:28 +0100 Subject: 3-Tabellenproblem In-Reply-To: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> Message-ID: <002901c74b5d$9ffabd40$0201a8c0@thomas> 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' > Gewünschtes Ergebnis wäre z.B.: > > artikel.id | kat.name > ------------------------------- > 3 | cat1 > 3 | cat2 > 3 | cat3 > 5 | cat1 > 5 | cat2 > 5 | cat3 > > So bekomme ich jedenfalls kein Ergebnis: > > SELECT artikel.id , kat.name > FROM artikel > INNER JOIN atokat ON atokat.artikel_id = artikel.id > INNER JOIN kat ON kat.id = atokat.kat_id > WHERE ( kat.name = 'cat1' AND kat.name = 'cat2' AND > kat.name = 'cat3' ) > ORDER BY artikel.id Hast du schon mal folgendes probiert: Select item.id from item left join item_cat on item_cat.id = item.id where item_cat.cat_id in ( select cat.id from cat where cat.name in (cat1, cat2,cat3) ) Du mußt, so wie ich das sehen, mindesten die "atokat" mit der "cat" 3 mal joinen und dann das ganze gegen eben die artikel abgleichen. Select item from item_cat left join cat t1 on t1.id = item_cat.id left join cat t2 on t2.id = item_cat.id left join cat t3 on t3.id = item_cat.id left join item on item.id = item_cat.item_id where t1.name = 'cat1' and t2.name = 'cat2' and t3.name = 'cat3' order by item.id Mit freundlichen Grüssen Thomas Goik Ihre Auktionsseiten im Internet http://www.auxion.de http://www.Xhammer.de -- Lofox GmbH Geschäftsführerin: Evelyn Fuchs Im Kamperholz 48 44805 Bochum - Germany Amtsgericht Bochum HRB 7042 USt-IdNr.: DE215698227 St.-Nr. Bochum 306/5885/0172 _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From gerd at roo.de Thu Feb 8 09:53:22 2007 From: gerd at roo.de (gerd) Date: Thu, 8 Feb 2007 09:53:22 +0100 Subject: 3-Tabellenproblem In-Reply-To: <002901c74b5d$9ffabd40$0201a8c0@thomas> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <002901c74b5d$9ffabd40$0201a8c0@thomas> Message-ID: <77724DF0-BD42-42A5-A370-8F44E079B9C1@roo.de> Am 08.02.2007 um 09:46 schrieb Technik auXion.de: > 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' >> Gewünschtes Ergebnis wäre z.B.: >> >> artikel.id | kat.name >> ------------------------------- >> 3 | cat1 >> 3 | cat2 >> 3 | cat3 >> 5 | cat1 >> 5 | cat2 >> 5 | cat3 >> >> So bekomme ich jedenfalls kein Ergebnis: >> >> SELECT artikel.id , kat.name >> FROM artikel >> INNER JOIN atokat ON atokat.artikel_id = artikel.id >> INNER JOIN kat ON kat.id = atokat.kat_id >> WHERE ( kat.name = 'cat1' AND kat.name = 'cat2' AND >> kat.name = 'cat3' ) >> ORDER BY artikel.id > > > Hast du schon mal folgendes probiert: > > Select item.id > from item > left join item_cat on item_cat.id = item.id > where item_cat.cat_id > in ( > select cat.id from cat where cat.name in (cat1, cat2,cat3) > ) > > Du mußt, so wie ich das sehen, mindesten die "atokat" mit der "cat" > 3 mal > joinen und dann das ganze gegen eben die artikel abgleichen. > > Select item from > item_cat left join cat t1 on t1.id = item_cat.id > left join cat t2 on t2.id = item_cat.id > left join cat t3 on t3.id = item_cat.id > left join item on item.id = item_cat.item_id > where t1.name = 'cat1' and t2.name = 'cat2' and t3.name = 'cat3' > order by item.id Danke, Thomas, probiere ich später! Muß jetzt ins Schneegestöber... Gruß Gerd _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From lists at sebastianmendel.de Thu Feb 8 14:15:19 2007 From: lists at sebastianmendel.de (Sebastian Mendel) Date: Thu, 08 Feb 2007 14:15:19 +0100 Subject: 3-Tabellenproblem In-Reply-To: <002901c74b5d$9ffabd40$0201a8c0@thomas> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <002901c74b5d$9ffabd40$0201a8c0@thomas> Message-ID: <45CB2267.70504@sebastianmendel.de> Technik auXion.de schrieb: >> 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' >> Gewünschtes Ergebnis wäre z.B.: >> >> [...] > > Hast du schon mal folgendes probiert: > > Select item.id > from item > left join item_cat on item_cat.id = item.id > where item_cat.cat_id > in ( > select cat.id from cat where cat.name in (cat1, cat2,cat3) > ) er hat aber 4.0 im Web - da dürfte das IMHO nicht funtkionieren ... -- Sebastian Mendel www.sebastianmendel.de _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From lists at sebastianmendel.de Thu Feb 8 14:26:14 2007 From: lists at sebastianmendel.de (Sebastian Mendel) Date: Thu, 08 Feb 2007 14:26:14 +0100 Subject: 3-Tabellenproblem In-Reply-To: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> Message-ID: <45CB24F6.7050806@sebastianmendel.de> 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' ungetestet: SELECT `artikel`.*, COUNT(`atokat`.`kat_id`) AS `anzahl` FROM `artikel` LEFT JOIN `atokat` ON `atokat`.`artikel_id` = `artikel`.`id` AND `atokat`.`kat_id` IN ('cat1', 'cat2', 'cat3') GROUP BY `artikel`.`id` HAVING `anzahl` = 3 davon ausgehend das (atokat.artikel_id, atokat.kat_id) UNIQUE ist -- Sebastian Mendel www.sebastianmendel.de _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From gerd at roo.de Thu Feb 8 19:14:01 2007 From: gerd at roo.de (gerd) Date: Thu, 8 Feb 2007 19:14:01 +0100 Subject: 3-Tabellenproblem In-Reply-To: <45CB24F6.7050806@sebastianmendel.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CB24F6.7050806@sebastianmendel.de> Message-ID: <429DC044-A487-4885-87E6-7754E5C549E1@roo.de> 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 From lists at sebastianmendel.de Fri Feb 9 11:09:17 2007 From: lists at sebastianmendel.de (Sebastian Mendel) Date: Fri, 09 Feb 2007 11:09:17 +0100 Subject: 3-Tabellenproblem In-Reply-To: <429DC044-A487-4885-87E6-7754E5C549E1@roo.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CB24F6.7050806@sebastianmendel.de> <429DC044-A487-4885-87E6-7754E5C549E1@roo.de> Message-ID: <45CC484D.8050800@sebastianmendel.de> gerd schrieb: > 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 . willst du nun die Daten des artikels oder auch die Daten der verbudnen Kategorien? Du hast bsiher immer nur von den Artikeln gesprochen - das ist ein 'kleiner' Unterschied ob du nur die Artikel haben willst die in mind. bestimten Kats. sind oder ob du auch alle Kategorien zu diesen bestimmten Artikeln haben möchtest ... > 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 du willst aber nicht nur die art.id ? dann könntest du dir die Tabelle artikel in der Abfrage auch sparen ... > 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` COUNT(`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). :-( du musst natürlich auch das COUNT anpassen -- Sebastian Mendel www.sebastianmendel.de _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From ml at rpdev.at Fri Feb 9 11:59:17 2007 From: ml at rpdev.at (Robert Pleniger) Date: Fri, 09 Feb 2007 11:59:17 +0100 Subject: 3-Tabellenproblem In-Reply-To: <45CC484D.8050800@sebastianmendel.de> References: <10B9488E-BB7B-41AC-9B98-5869561A1961@roo.de> <45CB24F6.7050806@sebastianmendel.de> <429DC044-A487-4885-87E6-7754E5C549E1@roo.de> <45CC484D.8050800@sebastianmendel.de> Message-ID: <45CC5405.9060207@rpdev.at> Hallo Gerd. Sebastian Mendel wrote: > gerd schrieb: >> Am 08.02.2007 um 14:26 schrieb Sebastian Mendel: >> >> 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 > > du willst aber nicht nur die art.id ? > dann könntest du dir die Tabelle artikel in der Abfrage auch sparen ... > > >> 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` > COUNT(`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). :-( Subselects sind bequem aber nicht notwendig. Damals als ich noch jung war ... ;-) > > du musst natürlich auch das COUNT anpassen > > Ist es nicht möglich, dass (atokat.artikel_id, atokat.kat_id) UNIQUE ist, benötigst Du für jede Kategorie eigene JOINs: SELECT `artikel`.* FROM `artikel` INNER JOIN `atokat` ak1 ON ak1.`artikel_id` = `artikel`.`id` INNER JOIN `kat` k1 ON ak1.`kat_id` = k1.`id` AND k1.`name` = 'cat1' INNER JOIN `atokat` ak2 ON ak2.`artikel_id` = `artikel`.`id` INNER JOIN `kat` k2 ON ak2.`kat_id` = k2.`id` AND k2.`name` = 'cat2' INNER JOIN `atokat` ak3 ON ak3.`artikel_id` = `artikel`.`id` INNER JOIN `kat` k3 ON ak3.`kat_id` = k3.`id` AND k3.`name` = 'cat3' GROUP BY `artikel`.`id` Servus Robert _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From benedikt at quirmbach.de Tue Feb 20 15:44:34 2007 From: benedikt at quirmbach.de (Benedikt Quirmbach) Date: Tue, 20 Feb 2007 15:44:34 +0100 Subject: =?ISO-8859-1?Q?Datens=E4tze_mit_gleichen_Inhalten_/_Anzahl?= Message-ID: <7F7EEB4B-5610-45F0-B172-E3B39A70F586@quirmbach.de> Hallo, ich habe eine Tabelle mit Adressdaten. Diese Adressen gehören zu Firmen. Die meisten Firmen haben mehrere Niederlassungen. Teilweise haben die Niederlassungen aber die selbe Liefer-Adresse. Ich möchte jetzt 1. Alle Adressen (bei jeder firmennummer jede nur einmal) 2. dazu die Nummer der Firma 3. und die Anzahl der Niederlassungen mit der genannten Adresse Sie sieht meine Tabelle aus (Sie enthält eine Menge Daten, hier nur die Lieferadressen): firmennummer, niederlassungsnummer, name1,name2,name3,ansprechpartner,str,plz,ort Was eine "gleiche Adresse" ist, muss ich erst noch beim Kunden erfragen. Ich gehe im Moment davon aus, dass name1,name2,name3,ansprechpartner,str,plz,ort übereinstimmen müssen. Möglicherweise sind es aber auch nur str,plz,ort. Hier ist meine Query, die wohl die ersten beiden Punkte abdeckt: SELECT DISTNCT firmennummer,str,plz,ort FROM Meine_Daten ORDER BY firmennummer Leifert diese Query überhaupt jede einzelne Adresse? Wie bekomme ich bei jeder Adresse auch die Anzahl der Niederlassungen geliefert? Viele Grüße Benedikt Quirmbach _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From driessen at edv-driessen.de Tue Feb 20 16:03:30 2007 From: driessen at edv-driessen.de (Uwe Driessen) Date: Tue, 20 Feb 2007 16:03:30 +0100 Subject: =?iso-8859-1?Q?RE:_Datens=E4tze_mit_gleichen_Inhalten_/_Anzahl?= In-Reply-To: <7F7EEB4B-5610-45F0-B172-E3B39A70F586@quirmbach.de> References: <7F7EEB4B-5610-45F0-B172-E3B39A70F586@quirmbach.de> Message-ID: <003501c75500$48d1f9f0$0565a8c0@uwe> Benedikt Quirmbach schrieb: > Subject: Datensätze mit gleichen Inhalten / Anzahl > > Hallo, > > ich habe eine Tabelle mit Adressdaten. Diese Adressen gehören zu > Firmen. Die meisten Firmen haben mehrere Niederlassungen. Teilweise > haben die Niederlassungen aber die selbe Liefer-Adresse. > > Ich möchte jetzt > 1. Alle Adressen (bei jeder firmennummer jede nur einmal) > 2. dazu die Nummer der Firma > 3. und die Anzahl der Niederlassungen mit der genannten Adresse > > Sie sieht meine Tabelle aus (Sie enthält eine Menge Daten, hier nur > die Lieferadressen): > > firmennummer, niederlassungsnummer, > name1,name2,name3,ansprechpartner,str,plz,ort > > Was eine "gleiche Adresse" ist, muss ich erst noch beim Kunden > erfragen. Ich gehe im Moment davon aus, dass > name1,name2,name3,ansprechpartner,str,plz,ort übereinstimmen müssen. > Möglicherweise sind es aber auch nur str,plz,ort. > > Hier ist meine Query, die wohl die ersten beiden Punkte abdeckt: > SELECT DISTNCT firmennummer,str,plz,ort FROM Meine_Daten ORDER BY > firmennummer Probiere mal SELECT firmennummer,str,plz,ort, count(firmennummer), count(niederlassungsnummer) FROM Meine_Daten ORDER BY firmennummer group by firmennummer > > Leifert diese Query überhaupt jede einzelne Adresse? > Wie bekomme ich bei jeder Adresse auch die Anzahl der Niederlassungen > geliefert? > > Viele Grüße > Benedikt Quirmbach Mit freundlichen Grüßen Drießen -- Software & Computer Uwe Drießen Lembergstraße 33 67824 Feilbingert Tel.: 06708 / 660045 Fax: 06708 / 661397 -- _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From benedikt at quirmbach.de Tue Feb 20 16:28:08 2007 From: benedikt at quirmbach.de (Benedikt Quirmbach) Date: Tue, 20 Feb 2007 16:28:08 +0100 Subject: =?ISO-8859-1?Q?Re:_Datens=E4tze_mit_gleichen_Inhalten_/_Anzahl?= In-Reply-To: <003501c75500$48d1f9f0$0565a8c0@uwe> References: <7F7EEB4B-5610-45F0-B172-E3B39A70F586@quirmbach.de> <003501c75500$48d1f9f0$0565a8c0@uwe> Message-ID: Hallo Uwe, danke für die Antwort. Leider fliegt mir MySQL bei der Query aus der Kurve: Zuerst war es mit der "group ...)-Clause nicht einverstanden. Dann habe ich sie gelöscht. Danach war MySQL nicht damit einverstanden, dass "normale" mit COUNT-SELECTS gemischt sind. Ich fürchte, so komme ich nicht weiter... Zumindest nicht ohne PHP, was ich aber wenn's geht vermeiden wollte. Grüße Benedikt Quirmbach Am 20.02.2007 um 16:03 schrieb Uwe Driessen: > Probiere mal > > SELECT firmennummer,str,plz,ort, count(firmennummer), count > (niederlassungsnummer) FROM > Meine_Daten ORDER BY > firmennummer > group by firmennummer _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From andreas.kretschmer at schollglas.com Tue Feb 20 16:36:29 2007 From: andreas.kretschmer at schollglas.com (Andreas Kretschmer) Date: Tue, 20 Feb 2007 16:36:29 +0100 Subject: =?iso-8859-1?Q?Datens=E4tz?= =?iso-8859-1?Q?e?= mit gleichen Inhalten / Anzahl In-Reply-To: References: <7F7EEB4B-5610-45F0-B172-E3B39A70F586@quirmbach.de> <003501c75500$48d1f9f0$0565a8c0@uwe> Message-ID: <20070220153629.GG23352@a-kretschmer.de> am Tue, dem 20.02.2007, um 16:28:08 +0100 mailte Benedikt Quirmbach folgendes: > Hallo Uwe, > > danke für die Antwort. Lern quoten! > > Leider fliegt mir MySQL bei der Query aus der Kurve: > > Zuerst war es mit der "group ...)-Clause nicht einverstanden. Dann Lies das Handbuch zur Syntax. Wenn Du Dinge wie count(foo) drin hast, mußt du nach den anderen feldern gruppieren, nach denen Du das halt gruppiert haben willst. > habe ich sie gelöscht. Danach war MySQL nicht damit einverstanden, > dass "normale" mit COUNT-SELECTS gemischt sind. > > Ich fürchte, so komme ich nicht weiter... > Zumindest nicht ohne PHP, was ich aber wenn's geht vermeiden wollte. Du könntest anfangen, Deine Tabellen zu normalisieren. Dann hättest Du das Problem nicht. Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From TConnect at gmx.net Thu Feb 22 16:09:52 2007 From: TConnect at gmx.net (Tim) Date: Thu, 22 Feb 2007 16:09:52 +0100 Subject: Zahl 0 statt NULL ausgeben In-Reply-To: <23743A18FACA4D4DA568F55844E70C994CD94E@md40.mediadefine.gmbh> Message-ID: <23743A18FACA4D4DA568F55844E70C994CD952@md40.mediadefine.gmbh> Hallo zusammen, ich habe eine Abfrage, die NULL-Werte zurück gibt. Wie kann ich schon im SQL-Statement dafür sorgen, dass diese durch die Zahl 0 ausgetauscht und zurückgegeben werden. Derzeit hantiere ich noch mit PHP und: $wert = ($row == "NULL") : 0 : $row; Ich bin mir aber sicher, dass man sich diesen Schritt schenken dies MySQL überlassen kann, oder? Liebe Grüße Tim _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de From jan_lists at sporbeck-family.de Thu Feb 22 16:15:19 2007 From: jan_lists at sporbeck-family.de (Jan Sporbeck) Date: Thu, 22 Feb 2007 16:15:19 +0100 Subject: Zahl 0 statt NULL ausgeben In-Reply-To: <23743A18FACA4D4DA568F55844E70C994CD952@md40.mediadefine.gmbh> References: <23743A18FACA4D4DA568F55844E70C994CD952@md40.mediadefine.gmbh> Message-ID: <45DDB387.2090807@sporbeck-family.de> Hallo! Tim wrote: > Ich bin mir aber sicher, dass man sich diesen Schritt schenken dies MySQL > überlassen kann, oder? Du suchst die Funktion IFNULL(). IFNULL(DeinFeld,0) /jan. http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html IFNULL(expr1,expr2) Wenn expr1 nicht NULL ist, gibt IFNULL() expr1 zurück; andernfalls wird expr2 zurückgegeben. IFNULL() gibt je nach Verwendungskontext einen numerischen oder einen String-Wert zurück. mysql> SELECT IFNULL(1,0); -> 1 mysql> SELECT IFNULL(NULL,10); -> 10 mysql> SELECT IFNULL(1/0,10); -> 10 mysql> SELECT IFNULL(1/0,'yes'); -> 'yes' _______________________________________________ Allgemeine Infos zur Liste: http://www.4t2.com/mysql/ Verwaltung: https://lists.4t2.com/cgi-bin/mailman/listinfo/mysql-de