MySQL - Abfrage über drei Tabellen

MasterDS

Erfahrenes Mitglied
Hallo!

Folgende Ausgangslage:
1. Tabelle mit Artikeln
2. Tabelle mit Kategorien
3. Tabelle mit Verknüpfungen dieser beiden Tabellen. Hierin Jeweils nur die ArtikelID und die KategorieID

In der Artikeltabelle gibt es eine Spalte "aktiv". Ich möchte nun alle Kategorieen (IDs) auflisten, welche ausschliesslich Artikel beinhalten, die inaktiv sind (also aktiv=0). Das Problem ist, dass es Kategorien in allen "Fällen" geben kann. Damit meine ich Kategorien, die keinen, einen, oder mehrere Artikel haben und dazu noch mit "gemischten" aktiv-Stati. Also nicht NUR aktiv oder NUR inaktiv, sondern gemischt.

Kriege das nicht hin. Könnt ihr mir da weiter helfen? Wenns geht ohne Joins, sodass ich das halbwegs nachvollziehen kann :D. Danke.

Gruß Dennis
 
Hi Dennis,

Kriege das nicht hin.

Und wie sehen Deine Ansätze aus?

Wenns geht ohne Joins, sodass ich das halbwegs nachvollziehen kann :D. Danke.

Wie willst Du denn auf anständig normalisierten Tabellen ohne Joins klarkommen? :suspekt:

Lies mal in Ruhe den Artikel Einfürung in Joins auf selfHTML.

Du bräuchtest einen Join der Tabellen, den Du nach Kategorien gruppierst und per HAVING-Klausel einschränkst, dass nur Kategorien ausgewählt werden, bei denen die Summe der aktiven Artikel 0 ist.

LG
 
Hallo und danke schonmal.

Die Artikelaktivität steht in der Artikeltabelle. Aktiv=1 ansonsten Aktiv=0.

Der Ansatz mit der Summe über die Aktivität ist gut. Das Probiere ich jetzt nochmal.
 
Hallo!

Okay ich habe jetzt:

Code:
SELECT categoryID, articleID, active FROM `s_articles_categories` 
INNER JOIN s_articles 
ON s_articles_categories.articleID=s_articles.id  AND active=0 
GROUP BY categoryID

Das listet mir schonmal alle Kategorien mit jeweiligen Artikeln und deren Status auf. Aber wie baue ich da noch die HAVING Abfrage ein, die über die Stati summiert?

Gruß Dennis
 
Habe es hinbekommen. Vielen Dank für die Anregungen.

Habe es wie folgt gelöst:

Code:
SELECT categoryID, articleID, s_articles.active ,count(*) as Anzahl, s_categories.description 
FROM `s_articles_categories`
INNER JOIN s_articles ON s_articles_categories.articleID=s_articles.id 
INNER JOIN s_categories ON s_articles_categories.categoryID=s_categories.id 
GROUP BY categoryID 
HAVING sum(s_articles.active)=0

Gruß

Dennis
 
Hallo!

Jetzt hab ich doch noch mal eine Frage. Und zwar würde ich nun gerne die entsprechenden Datensätze aus den Tabellen löschen. Gelöscht werden müssten diese aus der Tabelle 's_categories' und 's_articles_categories'.

Hatte mir da schon eine Abfrage gebastelt, aber damit hab ich den Server auf 100% Auslastung gebracht und musste erst beim Hoster anrufen damit der Server wieder ansprechbar war. Peinlich... :eek:

Daher bitte ich euch um Tips/Ideen, wie ich das lösen kann.

Danke schonmal.
 
Ginge das so?

Idee:
Code:
DELETE s_categories, s_articles_categories 
FROM `s_categories`
INNER JOIN s_articles_categories ON s_articles_categories.categoryID=s_categories.id
INNER JOIN s_articles ON s_articles.ID=s_articles_categories.articleID
group by s_categories.ID
HAVING sum(s_articles.active)=0

Muss mir sicher sein, bevor ich wieder den Server überlaste oder gar versehentlich was falsches lösche...
 
Hi,

Hatte mir da schon eine Abfrage gebastelt, aber damit hab ich den Server auf 100% Auslastung gebracht und musste erst beim Hoster anrufen damit der Server wieder ansprechbar war. Peinlich... :eek:

Muss mir sicher sein, bevor ich wieder den Server überlaste oder gar versehentlich was falsches lösche...

:eek: Das ist nicht Dein Ernst, oder? Man testet Abfragen NIE auf einem Liveserver! Du wirst doch wohl eine lokale Installation auf Deinem Rechner haben, wenn nicht: nachholen. Du erwartest hoffentlich nicht, dass Dir hier irgendjemand eine Abfrage abnickt, mit der Du dann eventuell doch Deine Livedatenbank zerschießt...

Und dann solltest Du Dich mit der DELETE-Syntax beschäftigen. Wie soll denn eine Gruppierung in einem DELETE- oder UPDATE-Statement funktionieren... :confused:
Ich denke, Du wirst das mit einer Subquery lösen müssen. Wie sah denn Dein Serverkiller-Statement aus?

LG
 
Hi,

:eek: Das ist nicht Dein Ernst, oder? Man testet Abfragen NIE auf einem Liveserver!

Da gebe ich dir recht. Ich stelle mir gerade selbst die Frage, warum ich das Live mache. Ich werde mir das ganze also erstmal lokal einrichten.

Und nein, ich erwarte hier keinen "Freifahrtschein". Ich wollte nur wissen, ob meine Abfrage so funktionieren würde/könnte. Offensichtlich nicht. Hatte auf mysql.de folgendes entdeckt:
DELETE t1, t2 FROM t1, t2, t3 WHERE t1.id=t2.id AND t2.id=t3.id;

...und hatte das mit meinem Ursprünglichen SELECT kombiniert.

Meine Serverkillerabfrage war folgendermaßen:

Code:
DELETE FROM s_categories, s_articles_categories WHERE s_categories.id IN 
(SELECT categoryID
FROM `s_articles_categories`
INNER JOIN s_articles ON s_articles_categories.articleID=s_articles.id 
INNER JOIN s_categories ON s_articles_categories.categoryID=s_categories.id 
GROUP BY categoryID 
HAVING sum(s_articles.active)=0)
AND
 s_articles_categories.categoryID IN ([selbe Subquery])

Irgendwie muss ich ja die Bedingungen für BEIDE Tabellen angeben können. So scheinbar schon mal nicht...

Wäre für Tipps dankbar.

Gruß

Dennis
 
Zurück