2011-09-28 62 views
5

我正在開發一個網站,人們可以將他們的房屋出租。我使用的PHP 5.2.0和MySQL 5+如何加入其他表格相關的多個表格

出版物存儲在表像這樣

ta_publications 
+---+-------------+------+ 
|id | name  | date | 
+---+-------------+------+ 
| 1 | name_001 | ... | 
| 2 | name_002 | ... | 
| 3 | name_003 | ... | 
+---+-------------+------+ 

我有diferent出版物,其中有「特色」,如「互聯網」,「發服務「,」衛星電視「等。

這些功能可能會在將來發生變化,我希望能夠添加/刪除/修改它們,因此我將它們存儲在數據庫中的表中。

ta_features 
+---+-------------+ 
|id | name  | 
+---+-------------+ 
| 1 | Internet | 
| 2 | Wi-Fi  | 
| 3 | satelital tv| 
+---+-------------+ 

其使用下表

ta_publication_features 
+---+-------------+----------------+ 
|id | type_id | publication_id | 
+---+-------------+----------------+ 
| 1 |  1  |  1  | 
| 2 |  2  |  1  | 
| 3 |  3  |  1  | 
+---+-------------+----------------+ 

我認爲這是很容易理解的相關出版物;有一個名爲name_001的出版物,其中有互聯網,無線網絡和衛星電視。

我有同樣的數據架構的圖片,我把它們存儲在該表中

ta_images 
+---+-------------+ 
|id | src   | 
+---+-------------+ 
| 1 | URL_1  | 
| 2 | URL_2  | 
| 3 | URL_3  | 
+---+-------------+ 

,並使用下表給他們涉及到出版物

ta_publication_images 
+---+-------------+----------------+----------+ 
|id | img_id  | publication_id | order | 
+---+-------------+----------------+----------+ 
| 1 |  1  |  1  | 0  | 
| 2 |  2  |  1  | 1  | 
| 3 |  3  |  1  | 2  | 
+---+-------------+----------------+----------+ 

列的順序給出了列出單個出版物時應顯示出版物的順序。

Philipp Reichart向我提供了一個查詢,它將搜索並獲取所有具有某些功能的出版物。它用於列出出版物,我無法修改它以將我需要的數據返回給我。

所以我想我會運行該查詢並獲取所有通過搜索條件的發佈,然後使用另一個查詢來列出它們。

這些出版物的列表應包括所有出版物數據(ta_publications上的所有內容)+所有特徵+最重要的(訂單0)圖像src。

對於每個出版物,我都可以有兩個簡單的查詢,它們將單獨返回最重要的圖像及其所有功能,但每頁列出25份出版物時,它將爲1個搜索查詢+(2每個出版物查詢* 25個出版物)= 51個不同的查詢,顯然效率不高。

編輯:

我的問題是,我怎麼可以創建,給予一定的發佈ID的SQL查詢,將返回:所有發佈的數據(上的一切ta_publications)+它的所有功能+最重要的(訂單0)image src

+0

寫得很好的問題,因爲你是那麼的新鮮。 :) + vote – Layke

+0

你實際上沒有問過問題。顯示你想要達到的目標。 –

+0

那麼你是要求一個查詢返回所有的出版物,按ID,包括他們的功能和頂部圖像? –

回答

1

你會得到重複發表和圖像數據與這一個,但在這裏是一種方法用一個查詢做到這一點:

SELECT p.id, p.name, p.date, 
      f.id, f.name, 
      i.id, i.src 
    FROM ta_publications p 
    JOIN ta_publication_features pf ON p.id = pf.publication_id 
    JOIN ta_features f ON f.id = pf.type_id 
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
     AND pi.order = 0 
    JOIN ta_images i ON i.id = pi.img_id 
    WHERE p.id IN ( -- list of publication ids); 
+0

它的工作原理,但提供了冗餘數據,就像你說的那樣。有沒有辦法避免獲取這些冗餘數據? – Daniel

+0

考慮到關係的性質,沒有辦法繞過它。 –

+0

有什麼更好的,性能明智的,使用搜索查詢獲取可能的ID,然後使用您的查詢來獲取列表的信息,使用PHP刪除冗餘,或使用搜索查詢,然後爲每個出版物,做1查詢獲取IMG和第二個查詢來獲取所有功能的列表?第二種選擇更簡單,更具可預測性,但使用了大量查詢。我認爲與第二種選擇分開會更容易。你怎麼看? – Daniel

1
Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub 
Join ta_publications_features pf on pf.publication_id = pub.id 
Join ta_features f on f.id = pf.type_id 
Join ta_publication_images pi on pi.publication_id = pub.id 
Join ta_images i on i.id = pi.img_id 
Where pub.id = 'appropriate id' 
order by i.[order] 

如果我正確地關注了你的結構,這應該給你你需要的連接。你可以通過添加希望的列添加到選擇的統計結果。希望這有助於。

+0

如果你想要所有的出版物,並且因爲你想要頂部img只需要替換whith(其中i.order = 0) –

+0

的訂單(6個特徵和3個圖片的出版物)它會拋出18行。對於每張圖片,它提供了6行,每一行具有不同的特徵。 – Daniel

+0

添加pi.order = 0有助於解決問題,現在它爲每個功能返回一行。 – Daniel

相關問題