Php 如何对两个以上的表使用join?

Php 如何对两个以上的表使用join?,php,mysql,sql,Php,Mysql,Sql,我有三张桌子 tb\u相册--->id、title、description tb\u照片--->id,相册id,照片 tb\u标签--->id,相册id,标签 在这里,我想通过tb\u albums.id获取相册详细信息和it照片及it标签 如何在此处使用联接查询?通常,您可以在联接中使用任意数量的表。只需添加另一个JOIN语句。您可以参考以获得正确的语法(尽管它不会产生正确的结果) 但在这种特殊情况下,您不希望在所有表上使用简单联接,除非每个相册只有一张照片,每个相册只有一个标记。如果每个相册

我有三张桌子

tb\u相册
--->id、title、description

tb\u照片
--->id,相册id,照片

tb\u标签
--->id,相册id,标签

在这里,我想通过tb\u albums.id获取相册详细信息和it照片及it标签


如何在此处使用联接查询?

通常,您可以在联接中使用任意数量的表。只需添加另一个JOIN语句。您可以参考以获得正确的语法(尽管它不会产生正确的结果)

但在这种特殊情况下,您不希望在所有表上使用简单联接,除非每个相册只有一张照片,每个相册只有一个标记。如果每个相册有多张照片,每个相册有多个标记,则在单个查询中连接相册上的两个表将生成这两个表的笛卡尔乘积,换句话说,每个相册中标记和照片的所有可能组合。对于
N
照片和
M
标记,它们是
N*M
结果,而不是
N+M

此外,加入tb_相册也没有意义,因为您不需要为每张照片和每个标签重复有关每个相册的信息

正确的方法是从每个表中选择3个单独的简单选项,并在应用程序级别组合它们的结果

如果出于某些尴尬的原因,您需要通过一个查询来完成此操作,您可以执行以下操作:

SELECT * FROM tb_albums as A JOIN 
 (SELECT 'photo', id, photo as value FROM tb_photos 
  UNION ALL
  SELECT 'tag', id, tag as value FROM tb_tags) as B ON B.album_id = A.id

注意,这比单独选择要差得多,只有在没有其他选择的情况下才应该这样做

最后你想得到什么?相册行及其标记和照片计数?请提供每个表的样本,以及基于它们您期望得到的结果。如果不加入,如何获得相册详细信息及其照片和标记?尽管您做出了努力,我还是会抑制我对您的答案投否决票的冲动。@vartec:嗯,还有很多问题需要更高水平的专业知识,你可以专注于这些问题,完全忽略初学者的问题。你的回答确实不完整。这是伟大的,因为答案可以解释一切。你的没有。它只说:“不要那样做”,但没有解释为什么。如果有人问如何连接两个以上的表,那么他们可能不知道笛卡尔积是什么。没有MySQL来测试这一点,但我认为
a
无法从subselect中访问。它在SQL Server中绝对不可访问。另一件事是,您可以使用UNION ALL而不是UNION来避免不必要的独特排序。@vartec:在该示例中,WHERE子句中正在访问一个别名,这在SQL Server中也是正确的。在您的情况下,别名是从“同级”子选择中访问的,这是非常不同的。你试过你的查询吗?假设你有10本相册,每本都有10张照片和10个标签。查询的结果集是1000行,这是非常有用的。您对“非常无用”的定义是基于无法处理标准化数据的客户端应用程序。我发现我用非常擅长循环的语言编写客户端应用程序…@vartec你看到这个问题了吗?“这里如何使用联接查询?”所以,这里是如何使用联接。@戴姆斯:我说的是真正的数据库,不是真正的数据库引擎。你知道,就像几百万行一样,不是你在Excel中玩的东西。标准化数据?从何时开始,返回重复数据是标准化的?因为对于200行数据返回1000行是最佳选择?从什么时候开始,loop
for(i=0;在我国,只有一家公司会为亚百万记录数据库购买TeraData?
select * from tb_albums a
join tb_photos p on a.id = p.album_id
join tb_tags t on a.id = t.album_id