将8个表组合成1个查询

时间:2013-05-07 14:37:59

标签: sql join

在我最近开始的一个项目中,嘿嘿嘿嘿。

我有8个表需要加入,以便所有表格内容将通过1个单一查询显示

但是我很难提出正确的查询,因为我对SQL

很新

我制作了一个数据库图表,显示了密钥彼此之间的关系,不介意那些没有分配箭头的信息。

Diagram

所以基本上我只想加入所有8个表,这样我就可以通过php脚本编写例如。

$ result = mysql_query(“SQL”);

$ row = mysql_fetch_array($ result);

$ id = $ row [“value”]; 当然我会使用某种循环来显示多个项目

它将以我的首页上的多个项目结束,这些项目应该由该类别中的最新项目显示,我希望并假设这是一个简单的连接位置。

但总而言之,我正在寻找的是一个SQL,它将8个表与1个查询连接起来,这样我就可以使用8个表中任意一个的任何信息。

我想我找到了一个有效的解决方案

SELECT *
FROM Deal d
INNER JOIN DealPrice dp ON d.Id = dp.DealId
LEFT JOIN DealMedia dm ON d.Id = dm.DealId
LEFT JOIN StorageFile sf ON dm.Id = sf.binId AND sf.name = 'original_t'
LEFT JOIN DealLocation dl ON d.Id = dl.dealid
LEFT JOIN Location l ON dl.location = l.id
LEFT JOIN DealCategoryAssoc dca ON d.Id = dca.DealId
LEFT JOIN DealCategory dc ON dca.CategoryId = dc.id
LEFT JOIN I18N i ON dc.id = i.relatedId AND i.model = 'DealCategory' AND i.language = 'da_dk'

我发现还有另一个表DealLocation,我没有把它放到我的图表中因此我自己改变了一些代码

3 个答案:

答案 0 :(得分:5)

我会在此场景中使用INNER JOIN而不是LEFT JOIN,因为左边的连接将返回左表中的所有记录,即使右表中没有匹配项,我也不会认为你想要 - 很难从问题中分辨出来

Take a look at my favorite visual description of Joins

SELECT i18n.relatedid, 
       dealcategory.id, 
       dealcategoryassoc.dealid, 
       deal.location, 
       dealprice.pricevalue, 
       dealmedia.description, 
       location.city, 
       storagefile.extension, 
       storagefile.name, 
       storagefile.hash 
FROM   i18n 
       INNER JOIN dealcategory 
               ON i18n.relatedid = dealcategory.id 
       INNER JOIN dealcategoryassoc 
               ON dealcategory.id = dealcategoryassoc.categoryid 
       INNER JOIN deal 
               ON dealcategoryassoc.dealid = deal.id 
       INNER JOIN dealprice 
               ON deal.id = dealprice.dealid 
       INNER JOIN dealmedia 
               ON dealprice.dealid = dealmedia.dealid 
       INNER JOIN storagefile 
               ON dealmedia.id = storagefile.bindid 
       INNER JOIN location 
               ON deal.location = location.id 

答案 1 :(得分:0)

只识别顶级实体(所有实体都指向它 - 交易) 然后一个接一个地加入所有相关的表......

SELECT *
FROM Deal d
LEFT JOIN DealPrice dp ON d.Id = dp.DealId
LEFT JOIN DealMedia dm ON d.Id = dm.DealId
LEFT JOIN StorageFile sf ON dm.Id = sf.binId
LEFT JOIN Location l ON d.Id = l.Id
LEFT JOIN DealCategoryAssoc dca ON d.Id = dca.DealId
LEFT JOIN DealCategory dc ON dca.CategoryId = dc.id
LEFT JOIN i18N i ON dc.id = i.relatedId

答案 2 :(得分:-3)

您应该阅读relationships between tables。现在我不想提供整个解决方案,但是如果你想从表中所有数据来从8开始制作更大的表,那么你已经使用了外连接。

它看起来像这样(这是显示基本语法的伪代码)。

SELECT * FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.Id = t2.table1Id
LEFT JOIN Table3 t3 ON t2.Id = t3.table2Id
LEFT JOIN Table4 t4 ON t3.Id = t4.table3Id
LEFT JOIN Table5 t5 ON t4.Id = t5.table4Id
LEFT JOIN Table6 t6 ON t5.Id = t6.table5Id
LEFT JOIN Table7 t7 ON t6.Id = t7.table6Id
LEFT JOIN Table8 t8 ON t7.Id = t8.table7Id

语法ON是您使用Primary Key / Foreign Key指定关系的地方。