Php 如何在不使用内部联接的情况下联接表?
我不擅长编写MySQL查询,所以这个查询不能正常工作。我想选择所有“组”,并通过组中保存的ID获取组的外部信息,如组的创建者、最后一个更新它的人以及组中的图像数 在这个查询中,我使用的是内部联接,但是显然没有图像的组在这个查询中没有被选中。我希望查询选择所有组,不管发生什么,并使用ID获取所有组的信息。如果一个组没有图像,我希望图像计数为0,而不是忽略该组 这是当前查询: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
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子句,重新排列整个结果集
内部联接和外部联接之间的区别在于发生不匹配时的行为。内部联接删除不匹配的行,外部联接允许不匹配。除非有理由需要外部联接,否则几乎总是需要内部联接