Abfrage einer Wordpress-DB anpassen

Mifune

Neuer Benutzer
Beiträge
4
Hallo Allerseits,

eine kurze Zusammenfassung:

Ich betreibe eine Website über Filme auf Basis von Wordpress inkl. MySQL-Datenbank

Anhand eines Plugins, das eine SQL-Abfrage nutzt, gebe ich alle verfügbaren Filmkritiken + Details in einer Übersicht aus.

Das läuft auch alles wunderbar, zwei von einander unabhängige Probleme bekomme ich jedoch trotz Recherchen nicht gelöst. Den Code der Abfrage findet ihr am Ende und bei folgenden Fragen hoffe ich auf eure Hilfe:

1. "False Positives" beim Dublettencheck

Ich habe Filmkritiken zu zwei verschiedenen Filmen mit dem Titel Solaris geschrieben. Ein Film ist 1972 erschienen und einer 2002.
Die Abfrage sollte also erkennen, dass es sich um zwei verschiedene Kritiken handelt.
Dem ist aber nicht so - es wird nur einer der beiden Einträge ausgegeben.

Wie kann ich diesen Fehler über einen Vergleich des Feldes "Veröffentlichungsjahr" verhindern?


2. Nur ein Wert wird ausgegeben, obwohl mehrere verfügbar sind.

Manche Filme lassen sich mehreren Genres zuordnen. Nehmen wir bspw. an, in der Datenbank wäre bei einem Film unter Genre sowohl "Actionfilm" als auch "Thriller" vermerkt.

Die Abfrage gibt aktuell ausschließlich den alphanumerisch ersten Wert an. Was muss ich anstellen, damit alle verfügbaren Werte kommagetrennt ausgegeben werden?

Vielen Dank im Vorraus für jede Hilfe!

PS: Ich bin totaler SQL-Anfänger und habe bisher mehr mit Logik als mit tatsächlichem Wissen an der Abfrage gearbeitet. Bitte habt Gnade :-D


Hier seht ihr die Ausgabe der Abfrage auf der Website: Klick

Und hier die um Redundanzen erleichterte Fassung der Abfrage:

Code:
SELECT posts_post.ID AS post_ID,
       CONCAT('<b><a href=','https://filmsucht.org/',posts_post.post_name,'/','>',posts_post.post_title,'</a></b>') AS post_title_with_link_to_post,      
       post_taxonomy_regie_tbl.name AS post_taxonomy_regie,
       post_taxonomy_genre_tbl.name AS post_taxonomy_genre,
       post_taxonomy_erscheinungsjahr_tbl.name AS post_taxonomy_erscheinungsjahr,  
FROM wp360_posts AS posts_post
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_regie_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_regie_tbl_termtaxonomy ON post_taxonomy_regie_tbl_termtaxonomy.term_id = post_taxonomy_regie_tbl_terms.term_id  AND post_taxonomy_regie_tbl_termtaxonomy.taxonomy = 'regie' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_regie_tbl  ON post_taxonomy_regie_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_regie_tbl.term_taxonomy_id) AS post_taxonomy_regie_tbl
     ON post_taxonomy_regie_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_genre_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_genre_tbl_termtaxonomy ON post_taxonomy_genre_tbl_termtaxonomy.term_id = post_taxonomy_genre_tbl_terms.term_id  AND post_taxonomy_genre_tbl_termtaxonomy.taxonomy = 'genre' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_genre_tbl  ON post_taxonomy_genre_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_genre_tbl.term_taxonomy_id) AS post_taxonomy_genre_tbl
     ON post_taxonomy_genre_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_erscheinungsjahr_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_erscheinungsjahr_tbl_termtaxonomy ON post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.term_id = post_taxonomy_erscheinungsjahr_tbl_terms.term_id  AND post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.taxonomy = 'erscheinungsjahr' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_erscheinungsjahr_tbl  ON post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_erscheinungsjahr_tbl.term_taxonomy_id) AS post_taxonomy_erscheinungsjahr_tbl
     ON post_taxonomy_erscheinungsjahr_tbl.ID = posts_post.id
WHERE post_taxonomy_erscheinungsjahr_tbl.name != ''
   AND posts_post.post_type = 'post'
   AND posts_post.post_status = 'publish'
   GROUP BY post_title
 
Werbung:
ohne die Tabellen zu kennen wird das erst einmal schwer dir zu helfen, aber eines ist schon mal sichtbar: wenn Du gruppierst, müssen alle Spalten entweder gruppiert oder aggregiert werden. Das ist bei Dir nicht der Fall und damit ist die Abfrage syntaktisch falsch. Blöderweise ist MySQL nun aber zu blöd, das zu erkennen, und liefert irgend ein Zufallsergebniss aus.
 
Danke für deine Antwort.

ohne die Tabellen zu kennen wird das erst einmal schwer dir zu helfen

Hatte gehofft, es wäre eine reine Syntaxfrage. Würde das Posten der relevanten Tabellenköpfe ausreichen?


Wenn Du gruppierst, müssen alle Spalten entweder gruppiert oder aggregiert werden. Das ist bei Dir nicht der Fall und damit ist die Abfrage syntaktisch falsch. Blöderweise ist MySQL nun aber zu blöd, das zu erkennen, und liefert irgend ein Zufallsergebniss aus.

Ich dachte, das funktioniert über "GROUP BY post_title" in der letzten Zeile. Das Ergebnis sieht eigentlich wunderbar aus, alle Daten werden intakt ausgegeben.
Vielleicht habe ich für den hier geposteten Ausschnitt zuviel Code rausgelöscht. Wollte hier keinen riesigen Block posten.
Der Syntax Validator von eversql.com findet keine Fehler, wenn ich den gesamten Code prüfen lasse.

EDIT: Ha! Frage 1 hat sich erledigt. Dank deiner Anregung gruppiere ich nun nach post_id statt post_title und nun werden alle vermeintlich doppelten Kritiken angezeigt. Ist ja auch total logisch.
 
Es sei erwähnt das, wenn du deine Syntax nicht korrigierst, MySQL in einer neueren Version sehr wohl Fehler melden wird. Daher lieber jetzt Hand anlegen falls etwas nicht aggregiert oder gruppiert wird.
 
Gut. Für 2. suchst Du eine Aggregation, in PostgreSQL nennt sich die passende Funktion string_agg().

Danke, mit diesem Ansatz recherchiere ich mal.

Es sei erwähnt das, wenn du deine Syntax nicht korrigierst, MySQL in einer neueren Version sehr wohl Fehler melden wird. Daher lieber jetzt Hand anlegen falls etwas nicht aggregiert oder gruppiert wird.

Würde ich sehr gerne, kenne mich aber überhaupt nicht aus. Könntest du aus meinem Code einen konkreten Fehler und eine Richtung für die Lösung benennen, damit ich mich da schlau machen kann? Welche Syntax sind falsch bzw. fehlen?

Hier der gesamte Code ohne Kürzungen:

Code:
SELECT posts_post.ID AS post_ID,
       CONCAT('<b><a href=','https://filmsucht.org/',posts_post.post_name,'/','>',posts_post.post_title,'</a></b>') AS post_title_with_link_to_post,      
       post_taxonomy_regie_tbl.name AS post_taxonomy_regie,
       post_taxonomy_genre_tbl.name AS post_taxonomy_genre,
       post_taxonomy_erscheinungsjahr_tbl.name AS post_taxonomy_erscheinungsjahr,
       post_taxonomy_jahrzehnt_tbl.name AS post_taxonomy_jahrzehnt,
       post_taxonomy_produktionsland_tbl.name AS post_taxonomy_produktionsland,          
       post_taxonomy_stroemung_tbl.name AS post_taxonomy_stroemung,
       post_taxonomy_gattung_tbl.name AS post_taxonomy_gattung,
       post_taxonomy_wertungtom_tbl.name AS post_taxonomy_wertungtom      
FROM wp360_posts AS posts_post
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_regie_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_regie_tbl_termtaxonomy ON post_taxonomy_regie_tbl_termtaxonomy.term_id = post_taxonomy_regie_tbl_terms.term_id  AND post_taxonomy_regie_tbl_termtaxonomy.taxonomy = 'regie' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_regie_tbl  ON post_taxonomy_regie_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_regie_tbl.term_taxonomy_id) AS post_taxonomy_regie_tbl
     ON post_taxonomy_regie_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_genre_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_genre_tbl_termtaxonomy ON post_taxonomy_genre_tbl_termtaxonomy.term_id = post_taxonomy_genre_tbl_terms.term_id  AND post_taxonomy_genre_tbl_termtaxonomy.taxonomy = 'genre' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_genre_tbl  ON post_taxonomy_genre_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_genre_tbl.term_taxonomy_id) AS post_taxonomy_genre_tbl
     ON post_taxonomy_genre_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_erscheinungsjahr_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_erscheinungsjahr_tbl_termtaxonomy ON post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.term_id = post_taxonomy_erscheinungsjahr_tbl_terms.term_id  AND post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.taxonomy = 'erscheinungsjahr' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_erscheinungsjahr_tbl  ON post_taxonomy_erscheinungsjahr_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_erscheinungsjahr_tbl.term_taxonomy_id) AS post_taxonomy_erscheinungsjahr_tbl
     ON post_taxonomy_erscheinungsjahr_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_jahrzehnt_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_jahrzehnt_tbl_termtaxonomy ON post_taxonomy_jahrzehnt_tbl_termtaxonomy.term_id = post_taxonomy_jahrzehnt_tbl_terms.term_id  AND post_taxonomy_jahrzehnt_tbl_termtaxonomy.taxonomy = 'jahrzehnt' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_jahrzehnt_tbl  ON post_taxonomy_jahrzehnt_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_jahrzehnt_tbl.term_taxonomy_id) AS post_taxonomy_jahrzehnt_tbl
     ON post_taxonomy_jahrzehnt_tbl.ID = posts_post.id
    LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_produktionsland_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_produktionsland_tbl_termtaxonomy ON post_taxonomy_produktionsland_tbl_termtaxonomy.term_id = post_taxonomy_produktionsland_tbl_terms.term_id  AND post_taxonomy_produktionsland_tbl_termtaxonomy.taxonomy = 'produktionsland' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_produktionsland_tbl  ON post_taxonomy_produktionsland_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_produktionsland_tbl.term_taxonomy_id) AS post_taxonomy_produktionsland_tbl
     ON post_taxonomy_produktionsland_tbl.ID = posts_post.id
  LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_stroemung_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_stroemung_tbl_termtaxonomy ON post_taxonomy_stroemung_tbl_termtaxonomy.term_id = post_taxonomy_stroemung_tbl_terms.term_id  AND post_taxonomy_stroemung_tbl_termtaxonomy.taxonomy = 'stroemung' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_stroemung_tbl  ON post_taxonomy_stroemung_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_stroemung_tbl.term_taxonomy_id) AS post_taxonomy_stroemung_tbl
     ON post_taxonomy_stroemung_tbl.ID = posts_post.id
  LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_gattung_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_gattung_tbl_termtaxonomy ON post_taxonomy_gattung_tbl_termtaxonomy.term_id = post_taxonomy_gattung_tbl_terms.term_id  AND post_taxonomy_gattung_tbl_termtaxonomy.taxonomy = 'gattung' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_gattung_tbl  ON post_taxonomy_gattung_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_gattung_tbl.term_taxonomy_id) AS post_taxonomy_gattung_tbl
     ON post_taxonomy_gattung_tbl.ID = posts_post.id
  LEFT JOIN (SELECT name, object_id as id FROM wp360_terms AS post_taxonomy_wertungtom_tbl_terms INNER JOIN wp360_term_taxonomy AS post_taxonomy_wertungtom_tbl_termtaxonomy ON post_taxonomy_wertungtom_tbl_termtaxonomy.term_id = post_taxonomy_wertungtom_tbl_terms.term_id  AND post_taxonomy_wertungtom_tbl_termtaxonomy.taxonomy = 'wertungtom' INNER JOIN wp360_term_relationships AS rel_post_taxonomy_wertungtom_tbl  ON post_taxonomy_wertungtom_tbl_termtaxonomy.term_taxonomy_id = rel_post_taxonomy_wertungtom_tbl.term_taxonomy_id) AS post_taxonomy_wertungtom_tbl
     ON post_taxonomy_wertungtom_tbl.ID = posts_post.id  
WHERE post_taxonomy_wertungtom_tbl.name != ''
   AND posts_post.post_type = 'post'
   AND posts_post.post_status = 'publish'
   GROUP BY post_ID
 
Die Spalten

posts_post
post_name
post_title
post_taxonomy_regie_tbl.name
post_taxonomy_genre_tbl.name
post_taxonomy_erscheinungsjahr_tbl.name
post_taxonomy_jahrzehnt_tbl.name
post_taxonomy_produktionsland_tbl.name
post_taxonomy_stroemung_tbl.name
post_taxonomy_gattung_tbl.name
post_taxonomy_wertungtom_tbl.name

gehören entweder ins GROUP BY oder müssen mit einer Funktion aggregiert werden. Keine Spalte kann einfach im Select-Teil stehen ohne das klar definiert ist welcher Wert auszugeben ist.
 
Werbung:
Zurück
Oben