2011-01-20 153 views
0

我不擅长编写MySQL查询,所以这个查询不能正常工作。我想选择所有的“组”,并通过组中保存的ID获取组的外部信息,例如组的创建者,最后一个更新人员以及组中的图像数量。如何在不使用INNER JOIN的情况下连接表?

在此查询我使用INNER JOIN,但显然组有没有图像在此查询的arent选择。我希望查询能够选择所有组,并使用这些ID获取有关所有组的信息。如果一个组没有图像,我希望图像计数为0,而不是要忽略的组。

这是当前查询:

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 

FROM gallery_groups g INNER JOIN 
     users c INNER JOIN 
     users u INNER JOIN 
     gallery_images i 

WHERE g.created_by=c.id AND g.updated_by=u.id AND i.group=g.id $id 
GROUP BY g.name 
ORDER BY g.date_updated DESC, g.name 

我曾尝试更换INNER与LEFT JOIN连接,右JOIN和OUTER JOIN,但都只是导致SQL错误。

感谢您的帮助!

+0

有什么错误? – zerkms 2011-01-20 05:56:03

回答

3

将连接标准与它们所属的连接放在一起。 既然你是分组不要混用聚集(在列总和/ MAX等)和非聚集(场未在GROUP BY而不是在功能)即使MySQL允许你

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
GROUP BY g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname, g.updated_by, u.fullname 
ORDER BY g.date_updated DESC, g.name 

通过除图像计数其他几乎一切,这可能是更好的只是子查询

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
    c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, 
    IFNULL((
     select COUNT(1) 
     from gallery_images i 
     WHERE i.group=g.id), 0) as image_count 
FROM gallery_groups g LEFT JOIN 
     users c ON g.created_by=c.id LEFT JOIN 
     users u ON g.updated_by=u.id LEFT JOIN 
     gallery_images i ON i.group=g.id 
WHERE g.id = $id 
ORDER BY g.date_updated DESC, g.name 
1

当您在SQL连接两个表你必须给标准加入的。

SELECT g.id, g.name, g.date_created, g.date_updated, g.created_by, 
c.fullname AS creator_name, g.updated_by, u.fullname AS updater_name, COUNT(i.id) as image_count 
FROM gallery_groups g 
    INNER JOIN users c ON g.created_by=c.id 
    INNER JOIN users u ON g.updated_by=u.id 
    INNER JOIN gallery_images i ON i.group=g.id 
GROUP BY g.name 
ORDER BY g.date_updated DESC, g.name 

FROM子句首先执行,并收集查询返回的所有数据。然后执行GROUP BY和WHERE子句,减少将要返回的行数。最后执行ORDER BY子句,重新排列整个结果集。

内连接和外连接之间的差异是发生不匹配时的行为。内部连接删除不匹配的行,外部连接允许不匹配。除非你有理由说明为什么需要外连接,否则几乎总是需要内连接。

相关问题