繁体   English   中英

如何在不使用INNER JOIN的情况下联接表?

[英]How do I join tables without using INNER JOIN?

我不太擅长编写MySQL查询,因此该查询无法正常工作。 我想选择所有“组”,然后通过组中保存的ID来获取组的外部信息,例如组的创建者,最后一个要更新的人以及组中的图像数量。

在此查询中,我使用INNER JOIN,但显然在此查询中未选择任何图像的组。 我希望查询无论如何都选择所有组,并使用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

我尝试用LEFT JOIN,RIGHT JOIN和OUTER JOIN替换INNER JOIN,但是所有这些都导致sql错误。

感谢您提供的所有帮助!

将联接条件与联接所属的位置放在一起。 即使MySQL允许您也不要混合使用汇总(列上的总和/最大值等)和非汇总( 字段不在GROUP BY中且不在函数中

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

当您在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子句,重新排列整个结果集。

内连接和外连接之间的区别是发生不匹配时的行为。 内联接删除不匹配的行,外联接允许不匹配。 除非您有理由需要外部连接,否则几乎总是需要内部连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM