[英]Complex SQL query, one to many relationship
我有一個查詢,我需要得到
我已經嘗試了幾件事,但無法弄清楚如何工作。 這就是我所擁有的(濃縮,因此您不必費力地瀏覽所有內容):
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,名稱,注釋(注釋數組),鏈接(鏈接數組)的對象,然后注釋將包含一堆注釋,date_add,用戶名和user_id,鏈接將包含一個一堆帶有鏈接,日期添加,用戶名和用戶ID的鏈接。 即使沒有鏈接或評論,它也必須工作。
我最近剛學了mySQL的基礎知識,但這遠遠超出了我的理解。 任何幫助都會很棒。 謝謝!
如果沒有大量冗余數據發送回,則無法在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';
這樣做的原因是,盡管您可以很好地加入dogs / comments表,但是當您開始嘗試加入鏈接時,如何將鏈接與評論關聯起來? 沒有明顯的聯接,因此您唯一的方法是使用外部聯接。 這會在您的通話中導致大量冗余數據。
同樣,這種事情使緩存變得更加容易和直觀。 以我的經驗,通常最簡單的方法是進行幾次自然查詢,而不是加入意大利面條。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.