我有一个查询,我需要
我已经尝试了几件事,并且无法弄清楚如何使用它。这就是我所拥有的(浓缩所以你不必全部涉及):
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的基础知识,但这远远超过我的想法。任何帮助都会很精彩。谢谢!
答案 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。这将导致您的电话中出现大量冗余数据。
此外,这种事情使缓存更容易,更直观。根据我的经验,通常最简单的方法是使用一些自然查询而不是意大利面加入。 :)