2010-04-13 88 views
1

我有一個查詢,這樣我需要得到複雜的SQL查詢,一對多的關係

  1. 具體的狗
  2. 與該狗
  3. 誰張貼每條評論的用戶所有評論
  4. 所有鏈接到狗
  5. 誰發佈各環節的用戶的圖像

我已經嘗試了幾件事情,並且無法弄清楚如何使用它。以下是我已經(冷凝,你沒有經歷過這一切涉水):

SELECT s.dog_id, 
     s.name, 
     c.comment, 
     c.date_added AS comment_date_added, 
     u.username AS comment_username, 
     u.user_id AS comment_user_id, 
     l.link AS link, 
     l.date_added AS link_date_added, 
     u2.username AS link_username, 
     u2.user_id AS link_user_id 
FROM dogs AS d 
LEFT JOIN comments AS c 
ON c.dog_id = d.dog_id 
LEFT JOIN users AS u 
ON c.user_id = u.user_id 
LEFT JOIN links AS l 
ON l.dog_id = d.dog_id 
LEFT JOIN users AS u2 
ON l.user_id = u2.user_id 
WHERE d.dog_id = '1' 

這是八九不離十接近的工作,但它只會返回我的第一個評論,第一個環節都作爲一個與我所要求的所有信息大陣。每條狗都有多條評論和鏈接,所以我需要它給我所有的評論和所有鏈接。理想情況下,它會返回一個包含dog_id,name,comments(一系列評論),鏈接(一系列鏈接)的對象,然後評論會有一堆評論,date_added,username和user_id,鏈接會有一個鏈接鏈接,date_added,用戶名和user_id。即使沒有鏈接或評論,它也必須工作。

最近我學會了mySQL的基礎知識,但是這遠遠超過了我的頭腦。任何幫助將是美好的。謝謝!

回答

3

如果沒有大量的冗餘數據被髮送回來,您無法在1個sql查詢中查詢。因爲評論和鏈接彼此沒有任何關係,你最好單獨做這些電話。

這樣總共有3個調用:1檢索狗數據,1檢索評論/用戶,1檢索鏈接/用戶。

SELECT d.dog_id, d.name FROM dogs AS d WHERE d.dog_id = '1'; 

SELECT c.comment, c.date_added AS comment_date_added, 
     u.username AS comment_username, u.user_id AS comment_user_id 
     FROM comments AS c LEFT JOIN users AS u ON c.user_id = u.user_id 
     WHERE c.dog_id = '1'; 

SELECT l.link AS link, l.date_added AS link_date_added, 
    u.username AS link_username, u.user_id AS link_user_id 
     FROM links AS l LEFT JOIN users AS u ON l.user_id = u.user_id 
     WHERE l.dog_id = '1'; 

這樣做的原因是,雖然你可以加入狗/ comments表不夠好,當你開始嘗試在鏈接加入 - 你如何關聯的鏈接評論?沒有明顯的連接,所以你唯一的方法就是使用OUTER JOIN。這將導致您的通話中出現大量冗餘數據。

此外,這種事情使緩存更容易和更直觀。在我的經驗中,通常最簡單的方法是使用一些自然查詢而不是意大利麪連接。 :)

+0

+1 - 一個單一的查詢可以工作,可能會快一點,但使用三個較小的查詢將大大簡化事情。 – 2010-04-13 21:24:52

+0

無論如何都讓我的生活更輕鬆。謝謝! – Ethan 2010-04-13 23:27:42