2016-03-19 69 views
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 

有誰知道爲什麼嗎?

+1

回答你的問題:它沒有。明確寫出ON子句中來自哪個表的列(例如'wp_terms.term_taxonomy_id')。您的GROUP BY聲明看起來很奇怪並且效率低下。我想你只是用來自變量的值填充它。如果是這種情況,那麼我建議在每次沒有針對此搜索條件的輸入值時構建您的查詢,而不是像'post_title LIKE'%%'這樣的東西。 –

+0

我用表暱稱重寫了所有內容(並更新了問題),但仍然無效。但是,請允許我問,「我建議構建您的查詢」是什麼意思?因爲在LIKE'%%'中,我有一個由搜索輸入填充的PHP變量。但我真的想讓我的SQL查詢更快。 – mesqueeb

+0

偏離主題,但值得注意的是,SQL中的通配符搜索效率極低 - 數據庫必須掃描整個表以查找匹配的記錄。當你有一個複雜的查詢或一個大型數據集時,這可能會使查詢變得非常緩慢。如果您希望在數據庫中獲取大量數據,則應該考慮使用'LIKE'%...%''語法的替代方法。替代方案通常需要更多的工作來完成,但如果您關心代碼的性能,則值得付出努力。 – Spudley

回答

0

因爲當您使用第二個參數時,在實際定義它之前,請參考term_link的列。這不是沒有結果,而是一個錯誤。

+0

你是對的,當我提出問題時,我有一個複製粘貼錯誤。但請再看一下。我編輯了這個問題:它現在給我寫了0個結果。甚至沒有錯誤... – mesqueeb