2012-05-17 31 views
0

我正在設計一個像pinterest(用於學習)的網站,我想知道我必須在主頁上做什麼查詢來顯示用戶的流。如何避免這個複雜的查詢?

我創建了這些6個表:

users 
boards 
pictures 
boards_pictures (many-to-many table) 
followers 
comments 

而在家裏,我做這個查詢來獲取所有追隨者的畫面。

SELECT users.username, pictures.link, comments.comment, boards.title 
FROM boards_pictures, pictures, followers, users, comments, boards 
WHERE (boards_pictures.id_user = followers.id_following) 
    AND (boards_pictures.id_picture = pictures.id) 
    AND (followers.id_user = $_session['userid']) 
    AND (users.id = followers.id_following) 
    AND (comments.picture_id = pictures.id) 
    AND (boards.id = boards_pictures.boards_id) 

是否有辦法避免這種複雜查詢(含6桌的JOIN)?

+2

在不知道每個表的表結構的情況下回答這個問題有點困難。 – saluce

+1

加入?我看不到一個單一JOIN – mkk

+2

這並不接近複雜的查詢(我今天早些時候修改了一個1000行)如果你需要所有六個表加入到所有這些表中,但不要使用隱式聯接,是非常糟糕的編程習慣和SQL反模式。沒有意義學習不正確,從現在開始只使用顯式連接。 – HLGEM

回答

1

我這裏還有DDL語句從查詢中推導出:

CREATE TABLE users (id integer, username varchar(30)); 
CREATE TABLE boards (id integer, title varchar(30)); 
CREATE TABLE pictures (id integer, link varchar(90)); 
CREATE TABLE boards_pictures (
    id_user integer, 
    id_picture integer, 
    boards_id integer); 
CREATE TABLE followers (id_user integer, id_following integer); 
CREATE TABLE comments (picture_id integer, comment varchar(350)); 

你在這裏混列命名風格,比較users.idfollowers.id_usercomments.picture_idboard_pictures.id_picture(最後2是非常誤導)。您擁有的表格越多,您必須對列的命名方式給予更多的關注。我認爲最適合使用單一常見模式,picture_iduser_id是最合適的。

您的查詢並不複雜,除非您使用implicit join notation。這不是推薦的方式,因爲有機會錯過一些謂詞,並且以2(或更多)表格結束Cartesian product

您的查詢可以寫成這樣:

SELECT u.username, p.link, c.comment, b.title 
    FROM boards_pictures bp 
    JOIN pictures p ON p.id = bp.id_picture 
    JOIN followers f ON bp.id_user = f.id_following 
    JOIN users u ON u.id = f.id_following 
    JOIN comments c ON c.picture_id = p.id 
    JOIN boards b ON b.id = bp.boards_id 
WHERE f.id_user = $_session['userid']; 

正如你現在看到的,查詢是非常簡單,只有一個謂語。 我在SQL Fiddle上創建了一個沒有數據的測試牀。

在我看來你的結構非常好。無需更改表格設計和此查詢。

1

它實際上是一個非常簡單的查詢,只是很多表。

與其試圖在一個大查詢中檢索所有內容,這將導致您的輸出中存在大量重複數據,我會執行一個查詢來檢索用戶/董事會/圖片信息,追隨者的另一個查詢以及另一個查詢查詢。

此外,您可以使用ANSI語法以獲得更好的可讀性。

+0

通過這種方式,我需要爲每個圖片的每個後續和一個查詢進行一次查詢。因此,如果在主頁上顯示我的以下50張最後一張照片,則需要執行1次查詢以檢索以下圖片+ 50個查詢以檢索每張圖片的評論。 – xRobot

+0

不,你會做一個查詢,檢索所有50張照片的評論 – RedFilter