MySQL: Suchfunktion in Verbindung mit Checkboxen

Große Klasse, das scheint nun zu 100% zu funktionieren! *auf Holz klopf*

Ich habe die View Anweisung noch um die Tabelle „land“ gekürzt:

CREATE VIEW genre\_all 
AS 
SELECT interpret.interpret\_id, 
group\_concat(distinct genre.genre\_name order by genre.genre\_id separator ', ') as genre
FROM interpret
JOIN interpret\_genre
ON interpret.interpret\_id = interpret\_genre.interpret\_id
JOIN genre
ON interpret\_genre.genre\_id = genre.genre\_id
GROUP BY interpret.interpret\_id;

Fazit: Um m:n Zuordnungstabellen mittels Checkboxen zu durchsuchen (wobei die einzelnen „Häckchen“ quasi mit einem „ODER“ verbunden werden), sollte man mit View Tabellen sowie „group_concat“ und „where in“ vertraut sein.

So, jetzt erst mal ein Bier, dann Schreibe ich mein PHP Skript um :wink: Prost und nochmals vielen Dank!

Nachtrag: Steht in der nachfolgenden Abfrage $genre_id in Anführungezeichen (in der „IN ()“ Klausel), wird nur nach der ersten aktivierten Checkbox gesucht.

SELECT interpret.*,
land.land_name,
group_concat(distinct genre.genre_name order by genre.genre_id separator ', ') as genre_found ,
genre_all.genre as all_genre
FROM interpret
JOIN genre_all
ON interpret.interpret_id = genre_all.interpret_id
JOIN land
ON interpret.land_id = land.land_id
JOIN interpret_genre
ON interpret.interpret_id = interpret_genre.interpret_id
JOIN genre
ON interpret_genre.genre_id = genre.genre_id
WHERE (interpret.interpret_name like ‚%$interpret_name%‘ OR ‚‘ = ‚$interpret_name‘)
AND (land.land_id = ‚$land_id‘ OR ‚‘ = ‚$land_id‘)
AND (interpret_genre.genre_id IN ($genre_id))
GROUP BY interpret.interpret_id;

Die Anführungszeichen müssen also weggelassen werden.

Momentan rätsel ich außerdem, wie der MySQL Syntax aussehen muss, damit die Abfrage auch dann funktioniert, wenn kein Genre (keine Checkbox) ausgewählt wurde.

Die Zeile „AND (interpret_genre.genre_id IN ($genre_id) or ‚‘ = ‚$genre_id‘)“ führt leider nicht zum gewünschten Erfolg. Auch mit alternativen Klammersetzungen hatte ich kein Glück.

Gute Nacht, Q_5!

Momentan rätsel ich außerdem, wie der MySQL Syntax aussehen
muss, damit die Abfrage auch dann funktioniert, wenn kein
Genre (keine Checkbox) ausgewählt wurde.

Einfach weglassen .

Manchmal ist es schleuer ein SQL query zusammen zu basteln .

Wo ich keine Abfrage brauche , brauch ich auch kein where .
Wo ich ein syntax fehler bekomme , kann ich auch nichts anders machen als diesen teil dann weg zu lassen .

das mit or ‚‘ = Eingabe , war ja nur eine logik die in dem falle mit operator = funktioniert, aber eben nicht mit allen funktionen , IN () gibt es nicht , also müssen wir uns vorher drum kümmern , ansonsten stimmt der syntax nicht.

Da es keine Einzahl von „Leute“ gibt, kann ich das auch nicht für eine person benutzen (Der leute dahinten ) :smile: Muss ich halt das wort weglassen. (Der dahinten) . Und schon hab ich es korrekt gesagt.

Fazit: Um m:n Zuordnungstabellen mittels Checkboxen zu
durchsuchen (wobei die einzelnen „Häckchen“ quasi mit einem
„ODER“ verbunden werden), sollte man mit View Tabellen sowie
„group_concat“ und „where in“ vertraut sein.

MySQL ist denkbar ungeeignet für m:n beziehungen , den VIEW gibt es erst seit der Version 5 . Soll heissen , grössere Datenbanken können da meist einfacher agieren. MySQL ist aber ein guter kompromiss und hat eine gute performance bei dem was es tun kann .
Auch transaktionen sind neue , also so ganz erwachsen ist MySQL nicht, aber so richtig erwachsene dinge brauchen die meisten auch nicht.

Übrigens
IN () ist ja nur eine andere form des OR

du könntest also alle checkboxen string mässig addieren

und dann den vollen vergleich schreiben

(
(genre = checkbox[1] OR genre = checkbox[2] OR genre = checkbox[3] )
OR
genre = checkboxenstring
)

Die „OR“ Anweisung einfach weglassen - also nur „AND (interpret_genre.genre_id IN ($genre_id)“ - funktioniert leider nicht. Wähle ich keine Checkbox erhalte ich folgenden Fehler sobald ich auf das Abfrageergebnis zugreife (z.B. wenn ich mit „num_rows“ die Zeilen zählen will):

„Notice: Trying to get property of non-object in…“

Ein möglicher - aber wenig eleganter - Weg ist es, eine Variable mit allen „Genres“ zu erstellen, wenn keine Checkbox gwählt wurde.

if (isset($\_POST['genre\_id'])) {
 $genre\_id = join(', ', $\_POST['genre\_id']);
} else {
 // wird kein Genre ausgewählt, wird nach allen Genres gesucht
 $genre\_id = '1, 2, 3, 4'; // anstelle von $genre\_id = ''
}

Besser wäre wohl eine IF Anweisung in MySQL (ist die Variable $genre_id leer, soll das „Genre-Filter“ nicht angewendet werden). Das könnte/müsste funktionieren, ich muss es allerdings erst testen.

Die „OR“ Anweisung einfach weglassen - also nur „AND
(interpret_genre.genre_id IN ($genre_id)“ - funktioniert

du mchst mich fertig .

wenn du mal klammern setzen würderst , wurdest du eigentlich sehen welche terms zusammen was ergeben

interpreter und genre
( dies oder das ) AND (dies oder das)

willst du also kein genre mehr , muss das genre einfach nur nicht im when auftauchen , denn WHEN nimmt von der ganzen menge gefunden diese aus die eben nicht zutreffen .

da wir „dies“ als interpret_genre.genre_id IN ($genre_id) haben ,
und "dies oder das " nur zusammen funktioniert (bzw das „das“ hier eh nur wirkt bei keine eingabe) , nehmen wir den ganzen
term in klammern plus das AND davor weg.

also

interpret
(dies oder das)

und schon findest du alle genre, da du ja gar keinen ausschliesst , bzw keine einschränkung auf bestimmte vornimmst , where findet bestimmte von allen .

konrekt

if (is_array($inputcheckboxenarray))
$sql .= " AND interpret_genre.genre_id IN (".join(",",$inputcheckboxenarray).")" ;

oder wie auch immer du festellst wann keine checkbox geklickt wurde.