如何加入其他表格相关的多个表格

问题描述:

我正在开发一个网站,人们可以将他们的房屋出租。我使用的PHP 5.2.0和MySQL 5+如何加入其他表格相关的多个表格

出版物存储在表像这样

ta_publications 
+---+-------------+------+ 
|id | name  | date | 
+---+-------------+------+ 
| 1 | name_001 | ... | 
| 2 | name_002 | ... | 
| 3 | name_003 | ... | 
+---+-------------+------+ 

我有diferent出版物,其中有“特色”,如“互联网”,“发服务“,”卫星电视“等。

这些功能可能会在将来发生变化,我希望能够添加/删除/修改它们,因此我将它们存储在数据库中的表中。

ta_features 
+---+-------------+ 
|id | name  | 
+---+-------------+ 
| 1 | Internet | 
| 2 | Wi-Fi  | 
| 3 | satelital tv| 
+---+-------------+ 

其使用下表

ta_publication_features 
+---+-------------+----------------+ 
|id | type_id | publication_id | 
+---+-------------+----------------+ 
| 1 |  1  |  1  | 
| 2 |  2  |  1  | 
| 3 |  3  |  1  | 
+---+-------------+----------------+ 

我认为这是很容易理解的相关出版物;有一个名为name_001的出版物,其中有互联网,无线网络和卫星电视。

我有同样的数据架构的图片,我把它们存储在该表中

ta_images 
+---+-------------+ 
|id | src   | 
+---+-------------+ 
| 1 | URL_1  | 
| 2 | URL_2  | 
| 3 | URL_3  | 
+---+-------------+ 

,并使用下表给他们涉及到出版物

ta_publication_images 
+---+-------------+----------------+----------+ 
|id | img_id  | publication_id | order | 
+---+-------------+----------------+----------+ 
| 1 |  1  |  1  | 0  | 
| 2 |  2  |  1  | 1  | 
| 3 |  3  |  1  | 2  | 
+---+-------------+----------------+----------+ 

列的顺序给出了列出单个出版物时应显示出版物的顺序。

Philipp Reichart向我提供了一个查询,它将搜索并获取所有具有某些功能的出版物。它用于列出出版物,我无法修改它以将我需要的数据返回给我。

所以我想我会运行该查询并获取所有通过搜索条件的发布,然后使用另一个查询来列出它们。

这些出版物的列表应包括所有出版物数据(ta_publications上的所有内容)+所有特征+最重要的(订单0)图像src。

对于每个出版物,我都可以有两个简单的查询,它们将单独返回最重要的图像及其所有功能,但每页列出25份出版物时,它将为1个搜索查询+(2每个出版物查询* 25个出版物)= 51个不同的查询,显然效率不高。

编辑:

我的问题是,我怎么可以创建,给予一定的发布ID的SQL查询,将返回:所有发布的数据(上的一切ta_publications)+它的所有功能+最重要的(订单0)image src

+0

写得很好的问题,因为你是那么的新鲜。 :) + vote – Layke

+0

你实际上没有问过问题。显示你想要达到的目标。 –

+0

那么你是要求一个查询返回所有的出版物,按ID,包括他们的功能和顶部图像? –

你会得到重复发表和图像数据与这一个,但在这里是一种方法用一个查询做到这一点:

SELECT p.id, p.name, p.date, 
      f.id, f.name, 
      i.id, i.src 
    FROM ta_publications p 
    JOIN ta_publication_features pf ON p.id = pf.publication_id 
    JOIN ta_features f ON f.id = pf.type_id 
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
     AND pi.order = 0 
    JOIN ta_images i ON i.id = pi.img_id 
    WHERE p.id IN ( -- list of publication ids); 
+0

它的工作原理,但提供了冗余数据,就像你说的那样。有没有办法避免获取这些冗余数据? – Daniel

+0

考虑到关系的性质,没有办法绕过它。 –

+0

有什么更好的,性能明智的,使用搜索查询获取可能的ID,然后使用您的查询来获取列表的信息,使用PHP删除冗余,或使用搜索查询,然后为每个出版物,做1查询获取IMG和第二个查询来获取所有功能的列表?第二种选择更简单,更具可预测性,但使用了大量查询。我认为与第二种选择分开会更容易。你怎么看? – Daniel

Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub 
Join ta_publications_features pf on pf.publication_id = pub.id 
Join ta_features f on f.id = pf.type_id 
Join ta_publication_images pi on pi.publication_id = pub.id 
Join ta_images i on i.id = pi.img_id 
Where pub.id = 'appropriate id' 
order by i.[order] 

如果我正确地关注了你的结构,这应该给你你需要的连接。你可以通过添加希望的列添加到选择的统计结果。希望这有助于。

+0

如果你想要所有的出版物,并且因为你想要顶部img只需要替换whith(其中i.order = 0) –

+0

的订单(6个特征和3个图片的出版物)它会抛出18行。对于每张图片,它提供了6行,每一行具有不同的特征。 – Daniel

+0

添加pi.order = 0有助于解决问题,现在它为每个功能返回一行。 – Daniel