Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在不使用内部联接的情况下联接表?_Php_Sql_Mysql_Inner Join - Fatal编程技术网

Php 如何在不使用内部联接的情况下联接表?

Php 如何在不使用内部联接的情况下联接表?,php,sql,mysql,inner-join,Php,Sql,Mysql,Inner Join,我不擅长编写MySQL查询,所以这个查询不能正常工作。我想选择所有“组”,并通过组中保存的ID获取组的外部信息,如组的创建者、最后一个更新它的人以及组中的图像数 在这个查询中,我使用的是内部联接,但是显然没有图像的组在这个查询中没有被选中。我希望查询选择所有组,不管发生什么,并使用ID获取所有组的信息。如果一个组没有图像,我希望图像计数为0,而不是忽略该组 这是当前查询: SELECT g.id, g.name, g.date_created, g.date_updated, g.created

我不擅长编写MySQL查询,所以这个查询不能正常工作。我想选择所有“组”,并通过组中保存的ID获取组的外部信息,如组的创建者、最后一个更新它的人以及组中的图像数

在这个查询中,我使用的是内部联接,但是显然没有图像的组在这个查询中没有被选中。我希望查询选择所有组,不管发生什么,并使用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
我曾尝试用左连接、右连接和外连接替换内部连接,但都只会导致sql错误


谢谢你的帮助

将联接条件与它们所属的联接放在一起。 即使MySQL允许,也不要将聚合(列上的sum/max等)和非聚合(不在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

将联接条件与其所属的联接放在一起。 即使MySQL允许,也不要将聚合(列上的sum/max等)和非聚合(不在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子句,并收集查询返回的所有数据。然后执行GROUPBY和WHERE子句,减少将返回的行数。最后执行ORDERBY子句,重新排列整个结果集


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

在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子句,并收集查询返回的所有数据。然后执行GROUPBY和WHERE子句,减少将返回的行数。最后执行ORDERBY子句,重新排列整个结果集

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