Also ich habe eine Abfrage, die Bananen abhängig von der Reihenfolge der LEFT JOIN
geht. Aber ich bin mir nicht sicher warum!Warum ist die Reihenfolge von LEFT JOIN in MySQL wichtig?
Hier ist die vollständige Abfrage mit korrekten Ergebnissen. Hinweis: postmeta
links beitreten am Anfang.
SELECT SQL_CALC_FOUND_ROWS wpp.ID
,post_title
,terms.NAME AS category
,terms.slug AS slug
,GROUP_CONCAT(terms.slug SEPARATOR ', ') AS allslug
,GROUP_CONCAT(postmeta.meta_value SEPARATOR ', ') AS allmetavalues
FROM wp_posts AS wpp
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
GROUP BY wpp.ID
HAVING (
post_title LIKE '%%'
OR allslug LIKE '%%'
OR allmetavalues LIKE '%%'
)
AND (allslug LIKE '%gifts-toys-and-animation%')
ORDER BY post_date DESC LIMIT 20 OFFSET 0
Wenn ich die LEFT JOIN
‚s in der folgenden Reihenfolge schreiben - postmeta am Ende - es mir irgendwelche Ergebnisse nicht mehr geben:
LEFT JOIN wp_term_relationships AS term_link ON wpp.ID = term_link.object_id
LEFT JOIN wp_terms AS terms ON term_link.term_taxonomy_id = terms.term_id
LEFT JOIN wp_postmeta AS postmeta ON wpp.ID = postmeta.post_id
Weiß jemand, warum?
Um Ihre Frage zu beantworten: Es tut es nicht. Schreiben Sie explizit aus welcher Tabelle eine Spalte in Ihrer ON-Klausel kommt (zB 'wp_terms.term_taxonomy_id'). Ihre GROUP BY-Anweisung scheint wirklich seltsam und ineffizient zu sein. Ich schätze, Sie füllen nur Werte aus Variablen. Wenn dies der Fall ist, schlage ich vor, dass Sie Ihre Abfrage erstellen, anstatt Dinge wie "post_title LIKE '%%" jedes Mal, wenn es keinen Eingabewert für diese Suchbedingung gibt. –
Ich habe alles mit Tabellen-Spitznamen umgeschrieben (und die Frage aktualisiert), aber es hat immer noch nicht funktioniert. Aber lass mich auch fragen, was meinst du mit "Ich schlage vor, deine Anfrage zu erstellen"? Denn im LIKE '%%' habe ich eine PHP-Variable, die von einer Sucheingabe ausgefüllt wird. Aber ich möchte meine SQL-Abfrage wirklich schneller machen. – mesqueeb
Off Topic, aber es ist wert, dass Wildcard-Suchvorgänge in SQL extrem ineffizient sind - die Datenbank muss die gesamte Tabelle durchsuchen, um übereinstimmende Datensätze zu finden. Wenn Sie eine komplexe Abfrage oder einen großen Datensatz haben, kann dies dazu führen, dass die Abfrage extrem langsam ausgeführt wird. Wenn Sie eine erhebliche Menge an Daten in Ihrer Datenbank erwarten, sollten Sie über Alternativen zur 'LIKE '% ...%' -Syntax nachdenken. Die Alternativen sind in der Regel mehr zu erstellen, aber sie sind den Aufwand wert, wenn Sie Wert auf die Leistung Ihres Codes legen. – Spudley