Ankündigung

Einklappen
Keine Ankündigung bisher.

CC Filter um mehrere Attribute abzufragen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Brubbel
    antwortet
    Also ich hab das jetzt aufgegeben. Auch mit mehreren Filtersets wurde das nicht besser. Mit 2 Oder Bedingungen klappte es noch aber mit 3 war wieder Chaos. .. und es sollen später evtl. mal 6 werden... Ich habe den Filter jetzt selbst gebaut und damit geht es dann erstmal.
    Danke auf jeden Fall für Deine Hinweise zur Lösung!!

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Puhhh... das kann ich auch nicht einfach so ausm Stehgreif. Ich glaube es ist auch besser mehrere Filtersets zu nutzen. Filtersets untereinander werden mit AND verbunden.

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Hm, irgendwie zu früh gefreut Das mit der Sprache und der Vermeidung der doppelten läuft jetzt prima. Aber die ODER Auswahl funktioniert (bei mir leider noch nicht richt

    Die verwendete Filtersammlung ist so auf gebaut:
    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 2022-11-25 16_38_54-Meine Inhaltselemente _ update.png
Ansichten: 112
Größe: 48,7 KB
ID: 26196

    Wäre das korrekt oder liegt da schon der Wurm?

    Im Code sieht eine "Leerabfrage" , an den kritischen Stellen mit der ODER Verknüpfung so aus:
    PHP-Code:
    ...?language=de&textsuche=&test_standard_1=&test_standard_2
    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: 2022-11-25 16_40_38-DevTools - update.png
Ansichten: 44
Größe: 31,7 KB
ID: 26197

    Im Feld A (test_standard_1) sind die Tags 13, 14, 15, 16 und 40 vorhanden. Im Feld B (test_standard_2) sind die Tags 13, 14 und 15 vorhanden.
    Suche ich jetzt nach 13 (
    PHP-Code:
    ...?language=de&textsuche=&test_standard_1=13&test_standard_2=13 
    , dann kommt Contao Fehlermeldung (Es ist ein Fehler aufgetreten) und im LOG steht:

    HTML-Code:
    [2022-11-25T16:49:41.922383+01:00] request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\SyntaxErrorException: "An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'cc_productcatalog.id  IN(1,2,3,29,31,34,36,39,43,46,47,49,50,51,60,62,65,67,6...' at line 1" at /var/www/vhosts/example.com/update.example.com/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php line 86 {"exception":"[object] (Doctrine\\DBAL\\Exception\\SyntaxErrorException(code: 1064): An exception occurred while executing a query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'cc_productcatalog.id  IN(1,2,3,29,31,34,36,39,43,46,47,49,50,51,60,62,65,67,6...' at line 1 at /var/www/vhosts/example.com/update.example.com/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php:86)\n[previous exception] [object] (Doctrine\\DBAL\\Driver\\PDO\\Exception(code: 1064): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'cc_productcatalog.id  IN(1,2,3,29,31,34,36,39,43,46,47,49,50,51,60,62,65,67,6...' at line 1 at /var/www/vhosts/example.com/update.example.com/vendor/doctrine/dbal/src/Driver/PDO/Exception.php:28)\n[previous exception] [object] (PDOException(code: 42000): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'cc_productcatalog.id  IN(1,2,3,29,31,34,36,39,43,46,47,49,50,51,60,62,65,67,6...' at line 1 at /var/www/vhosts/example.com/update.example.com/vendor/doctrine/dbal/src/Driver/PDO/Connection.php:69)"} []
    Es gibt aber definitiv, wie man oben in dem Code Schnipsel auch sehen kann, Datensätze die das Tag 13 in entweder dem einen oder anderen Feld haben. Es sollte also m.E. mindestens 2 Datensätze ausgeworfen werden.

    Ändere ich die Abfrage auf eine Suche nach Datensätzen die das Tag ID 16 in entweder dem einen oder anderen Feld haben, kommt kein Fehler und es werden mir aber alle Datensätze angezeigt (wohl weil es beim Feld test_standard_2 keine Treffer gibt)

    Ich habe mittlerweile einen Knoten im Kopf und hoffe Du kannst mir meinen Fehler aufzeigen?

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Ah, oke, verstehe, dafür sind die Dingers da und dazu braucht man da die Sprachfilter - Wir brauchen echt mal ein gescheites Wiki ;-)

    Danke für die Skizze und Aufklärung - Damit hat es dann natürlich geklappt ;-) Merci!

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Nope das ist richtig. Deine Liste wird jetzt halt lose. Die ersten IDs sind die Spracheinträge, jetzt wird mit OR die Ids der Tags-Filter angebackt.

    Das musst geklammert werden. Logik: SPRACH-IDS AND ( tags1 OR tags2 OR tags3 )

    Dafür gibts die Filter "Teilbereich Start/Stop". Du musst die Tags Filter damit umwrappen.

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Also, ich habe mir die ausgegebenen IDs jetzt mal genauer angeschaut und die doppelten kommen von der anderen Sprachversion. Es sieht aus, als würde bei der Konstruktion die Sprachfilterung nicht mehr funktionieren?
    Im Filter- und Listermodul ist der Filter für die aktive Sprache gesetzt. Aber es scheint nicht zu funktionieren. Wenn ich mir das SQL Query anschauen, was bei der Erzeugung der Listeneinträge verwendet wird, dann hätte ich da jetzt auch einen Join mit der Language Tabelle erwartet?
    HTML-Code:
    [2022-11-25T10:37:13.568223+01:00] contao.INFO: SELECT cc_productcatalog.* FROM cc_productcatalog WHERE cc_productcatalog.id  IN(396,395,339,432,433,337,431,336,430,333,429,332,428,331,427,327,426,326,425,323,424,322,319,423,318,422,315,421,312,420,295,294,293,292,259,258,257,256,255,254,222,481,219,217,67,29,472)  OR cc_productcatalog.id  IN(219,217,111,63,62)  OR cc_productcatalog.id  IN(1,2,3,29,31,34,36,39,43,46,47,49,50,51,60,62,65,67,69,70,71,72,73,74,81,84,85,94,95,96,101,106,108,110,114,116,119,121,123,125,127,129,131,133,135,137,139,146,161,163,165,168,170,188,190,192,194,203,197,199,201,205,207,209,211,213,215,217,220,222,225,227,228,231,233,236,239,241,244,247,250,252,254,256,259,261,262,263,272,292,295,296,299,301,305,306,309,312,315,318,319,322,323,326,327,331,332,333,336,337,339,342,345,347,348,351,352,355,356,363,361,366,367,370,372,374,376,379,381,382,385,386,391,392,396,397,404,407,176,178,180,277,280,282,284,287,288,291,17,18,19,20,22,25,149,151,153,155,157,159,172,89,92,184,186)  AND cc_productcatalog.publish='1'    ORDER BY cc_productcatalog.cert_date DESC LIMIT 0,50 []

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Zitat von Brubbel Beitrag anzeigen

    Danke erstmal. Ich muss mir das nachher noch mal anschauen ob das unterschiedliche IDs sind oder wieso die doppelt kommen.
    Lass dir am besten die IDs mal direkt ausgeben je Eintrag. Das ist ein Wert wie jeder andere. Falls Einträge inhaltlich und optisch fast gleich sind, kann das sehr schnell verwirrend werden.

    Du kannst in den Systemeinstellungen > CC auch den Debug-Modus aktivieren. Dann wird jede SQL Bedingung in den Systemlog geschrieben. Auch das hilft immens beim Aufbau von speziellen Filter-Aufgaben

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Zitat von Tim Beitrag anzeigen
    Die Listen-Ansicht wird anhand der IDs gebildet. Doppelte Ids erzeugen keine doppelten Einträge.
    Danke erstmal. Ich muss mir das nachher noch mal anschauen ob das unterschiedliche IDs sind oder wieso die doppelt kommen.

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Die Listen-Ansicht wird anhand der IDs gebildet. Doppelte Ids erzeugen keine doppelten Einträge.

    DISTINCT ist noch anders! Ids sind nie DISTINCT sondern das exakte Gegenteil. UNIQUE quasi.

    DESTINCT gibt Überschneidungen / Dopplungen aus.

    Eigene SQL Bedingung:

    id=1 OR id=1 OR id=1

    Gibt nur einen Eintrag aus.
    Zuletzt geändert von Tim; 25.11.2022, 08:01.

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Ja, ich erwarte (und bin hocherfreut), dass Datensatz 1 doppelt gefunden wird . Mir geht es um die Ausgabe der Treffer. Ich habe in der Listenansicht den einen Artikel ja nun doppelt. Was unerwünscht ist. Ich hätte "erwartet"/"erhofft", dass sich die Ausgabe automatisch wie bei SQL DISTINCT verhält.

    Muss ich das noch irgendwie sagen oder "ist das so" und ich muss schauen wie ich die Redundanz im (Lister-)Template selbst rausfiltere?

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Den letzten Satz verstehe ich nicht. Das führt doch dann zum Ausgangsproblem oder?
    Ja so ist es - Erstmal auf Ausgang, wenn das eine nicht richtig ist - ist grundsätzlich nicht verkehrt.
    ---
    Datensatz 1 muss doppelt gefunden werden. Das ist korrekt. Apfel kommt in beiden vor. Ich verstehe nicht genau was dein gewünschtes Ergebnis wäre.

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Den letzten Satz verstehe ich nicht. Das führt doch dann zum Ausgangsproblem oder?. Im Grunde ist das so:

    Datensatz 1 hat in
    Feld A Apfel
    Feld B Mango
    Feld C Apfel

    Datensatz 2 hat
    Feld A Apfel
    Feld B Pflaume
    Feld C Holunder

    Datensatz 3 hat
    Feld A Birne
    Feld B Mango
    Feld C Zirbe

    Wenn ich jetzt (Ohne Abfragekombinierer) eine Suche mit folgenden Parametern losschicke, erhalte ich 0 Datensätze
    HTML-Code:
    ....?language=de&feld_a=Apfel&feld_b=Apfel&feld_c=Apfel
    Wenn ich den Abfragekombinierer mit OR dazwischen packe. erhalte ich 3 Datensätze (den 1. 2x und den 2. 1x). Ich könnte damit leben, wenn die Ergebnisausgabe erkennt, dass der Datensatz 1 doppelt ausgegeben wird. Ich habe im Listenmodul nichts gefunden, was darauf hindeutet.

    Mache ich noch was falsch oder ist das normal und ich muss im Template die Datensätze vor der Ausgabe selbst noch mal reduzieren?


    Einen Kommentar schreiben:


  • Tim
    antwortet
    Zitat von Brubbel Beitrag anzeigen
    Oke, danke, den habe ich gefunden und ausprobiert. Im Ergebnis erhalte ich nun viele Einträge doppelt, bzw. dreifach. Wohl daher, weil einige Begriffe sowohl in Feld A als auch Feld B oder Feld C vorkommen. Wie kann ich die Ausgabe wieder so eindampfen, dass nur eindeutige Datensätze ausgeworfen werden?
    Ohne Abfragekombinierer werden die Filter mit AND verbunden. Dann sind es quasi auf-stackende Bedingungen.

    Einen Kommentar schreiben:


  • Brubbel
    antwortet
    Oke, danke, den habe ich gefunden und ausprobiert. Im Ergebnis erhalte ich nun viele Einträge doppelt, bzw. dreifach. Wohl daher, weil einige Begriffe sowohl in Feld A als auch Feld B oder Feld C vorkommen. Wie kann ich die Ausgabe wieder so eindampfen, dass nur eindeutige Datensätze ausgeworfen werden?

    Einen Kommentar schreiben:


  • Tim
    antwortet
    Zitat von Brubbel Beitrag anzeigen
    Hmm, leider habe ich doch noch eine Frage ... Wie kann ich denn erreichen, dass die Abfrage auf die 3 Felder als ODER Frage angesehen wird? Hatte ich komischerweise irgendwie noch nie ... Danke!
    CC hat einen eigenen Filter-Typ dafür "Abfragekombinierer". Den schaltest du zwischen deine Tags-Filter und setzt auf OR.

    Einen Kommentar schreiben:

Lädt...
X