0
所以我有一個查詢,香蕉取決於LEFT JOIN
的順序。 但我不知道爲什麼!爲什麼在MySQL中LEFT JOIN的順序很重要?
這是完整的查詢與正確的結果。注意:postmeta
在beginnig左側加入。
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
如果我按以下順序寫入LEFT JOIN
的 - 在最後postmeta - 它停止給我任何結果:
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
有誰知道爲什麼嗎?
回答你的問題:它沒有。明確寫出ON子句中來自哪個表的列(例如'wp_terms.term_taxonomy_id')。您的GROUP BY聲明看起來很奇怪並且效率低下。我想你只是用來自變量的值填充它。如果是這種情況,那麼我建議在每次沒有針對此搜索條件的輸入值時構建您的查詢,而不是像'post_title LIKE'%%'這樣的東西。 –
我用表暱稱重寫了所有內容(並更新了問題),但仍然無效。但是,請允許我問,「我建議構建您的查詢」是什麼意思?因爲在LIKE'%%'中,我有一個由搜索輸入填充的PHP變量。但我真的想讓我的SQL查詢更快。 – mesqueeb
偏離主題,但值得注意的是,SQL中的通配符搜索效率極低 - 數據庫必須掃描整個表以查找匹配的記錄。當你有一個複雜的查詢或一個大型數據集時,這可能會使查詢變得非常緩慢。如果您希望在數據庫中獲取大量數據,則應該考慮使用'LIKE'%...%''語法的替代方法。替代方案通常需要更多的工作來完成,但如果您關心代碼的性能,則值得付出努力。 – Spudley