复杂的SQL查询,一对多的关系

时间:2010-04-13 21:11:23

标签: mysql join

我有一个查询,我需要

  1. 一只特定的狗
  2. 与该狗有关的所有评论
  3. 发布每条评论的用户
  4. 狗的图像的所有链接
  5. 发布每个链接的用户
  6. 我已经尝试了几件事,并且无法弄清楚如何使用它。这就是我所拥有的(浓缩所以你不必全部涉及):

     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的基础知识,但这远远超过我的想法。任何帮助都会很精彩。谢谢!

1 个答案:

答案 0 :(得分: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';

原因是虽然你可以很好地加入狗/评论表,当你开始尝试加入链接时 - 你如何将评论的链接联系起来?没有明显的连接,所以你唯一的方法就是使用OUTER JOIN。这将导致您的电话中出现大量冗余数据。

此外,这种事情使缓存更容易,更直观。根据我的经验,通常最简单的方法是使用一些自然查询而不是意大利面加入。 :)