2012-12-31 73 views
1

我想知道是否有人能幫助我理解我正在嘗試解決的問題。MySql多表查詢

我正在wordpress網站上工作,但這是一個sql問題,因爲我只是在模板文件中查詢一些結果。

我有一個圖片庫是廣告框,我需要拉這些關於提供的電影名稱,做到這一點我使用廣告圖片上的一些自定義字段,稱爲'adlink'(關閉廣告)和廣告

我使用nextgen圖庫插件和查詢這些表,並且我有三個表包含我需要查詢的數據。

ngg_pictures,nggcf_field_values & nggcf_fields。

的nggcf表是自定義字段的表,

到目前爲止,我能得到什麼,我需要在兩個單獨的查詢,但是因爲它意味着查詢nggcf_field_values表兩次,我不能將其組合到一個查詢我有,我似乎無法排序。

我已經對mo中的搜索條件進行了硬編碼,但'close-encounters'位是傳遞的變量,而'156'是第一個查詢中的pid。

SELECT `eg_ngg_pictures`.`filename`, `eg_nggcf_field_values`.`fid`, `eg_nggcf_field_values`.`pid` 
FROM eg_ngg_pictures, eg_nggcf_field_values 
WHERE ((`eg_nggcf_field_values`.`field_value` LIKE 'close-encounters') AND (`eg_nggcf_field_values`.`pid` = eg_ngg_pictures.pid)) 



SELECT `eg_nggcf_field_values`.`field_value` 
FROM eg_nggcf_field_values, eg_nggcf_fields 
WHERE ((`eg_nggcf_fields`.`field_name` = 'adlink') AND (`eg_nggcf_fields`.`id` = eg_nggcf_field_values.fid) AND (`eg_nggcf_field_values`.`pid` = '156')) 

任何幫助,將不勝感激,我可以與我有什麼結果,但我想了解如何將這兩個結合起來,寫出更好的SQL語句。謝謝MRO

+0

瞭解有關左連接,內連接和外連接的信息。我相信它會做你想做的事情。 http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html是一個鏈接 – xQbert

+0

謝謝,看起來真的很有用 - 我會看看那個。 – mro

回答

2

Wordpress extension後,我覺得eg_nggcf_fields是包含自定義字段名稱表。 eg_nggcf_field_values表包含每個圖片的自定義字段的值。

所以,如果你正在尋找兩個字段,稱爲movienameadlink,你必須在field_values表中查找兩行。如果您給它一個不同的別名,您可以加入一個表格兩次:

select pic.filename 
,  pic.pid 
,  fv1.field_value as MovieName 
,  fv2.field_value as Adlink 
from eg_ngg_pictures pic 
inner join -- Find ID for the field called 'moviename' 
     eg_nggcf_fields f1 
on  f1.field_name = 'moviename' 
inner join -- Find value for field moviename for this picture 
     eg_nggcf_field_values as fv1 
on  fv1.pid = pic.pid 
     and fv1.fid = f1.fid 
inner join -- Find ID for the field called 'adlink' 
     eg_nggcf_fields f2 
on  f2.field_name = 'adlink' 
inner join -- Find value for field adlink for this picture 
     eg_nggcf_field_values as fv2 
on  fv2.pid = pic.pid 
     and fv2.fid = f2.fid 
where fv1.field_value like 'close-encounters' 
+0

非常感謝 - 這是訣竅 – mro

1

首先,我建議堅持使用JOIN表的現代ANSI語法,這意味着使用JOIN子句。

而不是使用:

FROM table1, table2 WHERE table1.id = table2.pid 

使用:

FROM Table 1 JOIN table2 ON table1.id = table2.id 

爲了簡便起見,我也建議你別名表,因爲這往往使代碼更易讀。不必每次都寫出egg_ngg_pictures,而只需引用您分配的別名即可。

最後,當您使用LIKE運營商,你通常會添加一個通配符的字符(通常%。即LIKE '%123'LIKE '123%')。你似乎只看完整的比賽,這意味着你可以堅持使用=,因爲這應該會給你稍微更好的表現。

我們重寫查詢,我會使用類似以下內容:

SELECT 
    pic.filename 
    , fieldval.fid 
    , fieldval.pid 
    , fieldval.field_value 
FROM 
    eg_ngg_pictures pic 
     JOIN eg_nggcf_field_values fieldval ON fieldval.pid = pic.pid 
     JOIN eg_nggcf_fields fields ON fields.id = fieldval.fid 
WHERE 
    ((fieldval.field_value = 'close-encounters') 
    AND fields.field_name = 'ad_link' 

注意,我無法測試查詢,因爲我沒有你的架構。但是通過將這兩個查詢合併到一個查詢中,使用'close_encounters'值撤回的field_Values.PID上的連接應該已經存在。

如果查詢不起作用,請隨意創建一個包含相關表格和一些數據的SQL小提琴,我會盡力讓它與之一起工作。

+0

嗨非常感謝 - 這真的很有用,我一直在玩sql小提琴(謝謝你的提示),但它不是在玩,這裏是我到目前爲止http://sqlfiddle.com/#!2/8138a1/ 3 – mro

+0

嗨 - 以上回答,但這是非常有用的,謝謝 – mro