2012-12-14 48 views
0

我目前正在一個項目中,我有信息存儲在幾個表中,都相互連接。我相信表格和列格式是合乎邏輯的,也是最好的選擇。但問題是,我沒有足夠的知識來構建足夠先進的查詢來獲取我需要的所有信息。高級mysql查詢,一次從多個表和行中獲取。加入?

主表是ab_ads,存儲廣告。這些廣告可以分配多種格式(例如250x360,980x120等),您也可以選擇他們應該展示的區域(即斯科訥,斯德哥爾摩,卡爾馬,達拉納,耶姆特蘭等)。

這是我如何存儲我的數據。我沒有顯示所有表格,但我希望這已經足夠。

廣告欄(ab_ads):(有更多的列,但他們不相關)

ID orgnum   company_name title   content   link 
1  556664-7524 Company Inc Lorem ipsum  Lorem ipsum  URL 

廣告狀態(ab_ads_states):

ID adID stateID 
1  1  2    // Skåne 
2  1  5    // Kalmar 
3  1  8    // Stockholm 
4  1  10   // Värmland 
5  2  2    // Skåne 
6  2  5    // Kalmar 
7  3  8    // Stockholm 
8  4  10   // Värmland 

廣告格式(ab_ads_formats )

ID adID formatID 
1  1  1    // 250x360 
2  1  2    // 980x120 
3  2  1    // 250x360 
4  3  2    // 980x120 

格式表(ab_formats)

ID name  width height 
1  Format 1 250  360 
2  Format 2 980  120 

所以,我有兩個閃光的旗幟都應該調用PHP腳本這反過來應該與所有的結果提供一個XML文件回。

我知道如何從不同的表格中選擇數據,但我從來沒有從另一個表格中選擇多行並將它們合併爲一個,我想這是我需要在這裏完成的。我非常感謝任何幫助。

Flash橫幅會向PHP文件stateIDformatID發送兩個參數。這意味着我必須SELECT ad WHERE state = param AND format = format。但是由於我存儲了多個廣告狀態條目,因此我不知道如何執行此操作。

編輯: 我也想在查詢中獲取的格式名稱,並讓他們在以下格式:「格式1,格式2」在一個名爲「格式」欄。我想這會需要某種加入?

在此先感謝!

回答

1

我認爲這將工作:

select ab.name as formats, aa.* from ab_ads as aa 
inner join ab_ads_states as aas on aa.id = aas.adid and aas.stateId = stateIdParam 
inner join ab_ads_formats as aaf on aa.id = aaf.adid and aaf.formatId = formatIdParam 
inner join ab_formats as ab on aaf.formatid = ab.id 

編輯: 我不是很好的MySQL,並沒有什麼對測試,但我認爲group_concat可能是你在找什麼對於。如果是的話,它可能會是這個樣子:

select group_concat(ab.name separator ", ") as formats from ab_ads aa 
inner join ab_ads_states as aas on aa.id = aas.adid and aas.stateId = 2 
inner join ab_ads_formats as aaf on aa.id = aaf.adid and aaf.formatId in(1,2) 
inner join ab_formats as ab on aaf.formatid = ab.id 
group by ab.id 
+0

謝謝Kevin!我將「aaf.formatId = formatIdParam」改爲「aaf.formatId IN(1,2)」來試用它。雖然,我注意到如果廣告同時分配了這兩種格式,我會得到兩行。有什麼辦法可以將兩行等列(Format1,Format2)上的列合併成一行,其中列「formats」具有這樣的字符串:「格式1,格式2」? – Jonathan

+0

@Jonathan這是一個更復雜的查詢,稱爲數據透視表。是否有可以返回的最大數量的格式?或者您是否需要它返回可能存在「格式1,格式2,......格式X」的所有格式的列表? – Kevin

+0

最好是後面的選項,因爲格式可能會隨時間而增加。但這取決於是否可能。感謝您花時間幫助我! :) – Jonathan

0

請嘗試以下SQL:

SELECT count(aaf.ID) AS TotalFormat, 
    group_concat(ab.name) AS formats 
FROM ab_ads aa 
INNER JOIN ab_ads_states AS aas ON aa.ID = aas.adID 
AND aas.stateID = 2 
INNER JOIN ab_ads_formats AS aaf ON aa.id = aaf.adID 
AND aaf.formatID in(1,2) 
INNER JOIN ab_formats AS ab ON aaf.formatID = ab.ID 
GROUP BY aaf.adID HAVING TotalFormat >=2 

SQL演示:http://sqlfiddle.com/#!2/9f0ab/10

相關問題