MySQL & php: count in Abfrage über 2 Tabellen

BenschM@ster

Mitglied
Hallo allerseits,

ich hab hier eine etwas komplizierte Abfrage vor.
Mal zu den Gegebenheiten:

Tabelle Artikel:
kategorien:
kategorie_id | kategorie_name
0 | Elektronik
1 | Lebensmittel
2 | Kleider

Artikel:
artikel_id | artikel_name | aktiviert
0 | Käse 0
1 | Milch | 1
2 | Jeans | 1
3 | Laptop | 0

kategorie_mapping
artikel_id | kategorie_id
1 1
2 2
2 1

Also es gibt 3 Tabellen, eine mit Kategorien, eine mit den Artikeln und eine für das Mapping (aus dem Grund, dass ein Artikel in mehreren Kategorien sein kann).

Jetzt möchte ich eine Abfrage machen, die mir alle Kategorien ausspuckt, die einen bestimmten Suchterm enthalten.
Soweit kein Problem.
Aber es sollen nur Kategorien angezeigt werden, die mindestens einen Katalog enthalten, der aktiviert sein muss.

Wie würde diese Abfrage aussehen?

Über Hilfe würde ich mich sehr freuen :)

Vielen Dank,
Ben
 
Mein SQL ist nicht das beste aber ich glaub so gehts.

SQL:
SELECT *  FROM `Kategorien` 
WHERE `kategorie_id` IN (
      SELECT `m`.`kategorie_id`
      FROM `kategorie_mapping` AS `m`
      LEFT JOIN `Artikel` AS `a` USING `artikel_id`
      WHERE  `a`.`akitviert`=1
)

I hope it works


Gruß Napofis
 
Zuletzt bearbeitet von einem Moderator:
Hi Napofis,
danke schonmal für deine Antwort.
Leider klappt das so noch nicht.
An welcher Stelle muss denn die Klammer nach dem "IN" wieder zugehen?
Leider überfordert mich diese Suchanfrage komplett, weiß absolut nicht was da passiert.

Was auch noch darin fehlt ist der Suchterm $search.

Viele Grüße,
Ben
 
Den search term hängst du ganz zum Schuß an. nach der Klammer die du nicht findest ^^ (Zeile 7)

Also ich dachte ich geh so vor, zu erst ein Subquery das mir alle aktiven Kategorien holt und dann wieder Filtert

SQL:
SELECT *  FROM `Kategorien`
WHERE `kategorie_id` IN (
      SELECT `m`.`kategorie_id`
      FROM `kategorie_mapping` AS `m`
      LEFT JOIN `Artikel` AS `a` USING `artikel_id`
      WHERE  `a`.`akitviert`=1
) AND `kategorie_name` LIKE "%$term%"
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Mach doch einen normalen Join der Tabellen (übrigens inner join, Kategorien, die keine Artikel haben, willst Du ja gar nicht), gruppier das nach Kategorie und wähle per HAVING-Klausel nur die aus, bei denen die Summe der aktivierten Artikel >= 1 ist. WHERE-Klausel wie gehabt. ;)

LG
 
Danke für alle Antworten.
So hab ich es jetzt hinbekommen:

SQL:
SELECT kategorien.name 
FROM kategorien,kategorie_mapping,artikel 
WHERE kategorien.kategorie_id = kategorie_mapping.kategorie_id 
AND kategorie_mapping.artikel_id = artikel.artikel_id 
AND artikel.aktiv = '1' 
AND (kategorien.kat_name 
LIKE '%$search%' 
OR kategorien.beschreibung 
LIKE '%$search%') 
GROUP BY kategorien.kategorie_id

Eine Having Klausel war gar nicht mehr nötig, er holt sich interessanterweise schon so nur alle Kategorien raus, welche aktivierte Kataloge beinhalten.

Danke an alle!
Viele Grüße,
Ben
 
Zuletzt bearbeitet von einem Moderator:
Zurück