2010-04-13 71 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