-3

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

我有 8 个需要连接的表,以便所有表的内容都将通过 1 个查询显示

但是我努力想出正确的查询,因为我对 SQL 很陌生

我制作了一个数据库图,显示了键之间的关系,不要介意那些没有分配箭头的只是信息。

图表

所以基本上我只希望所有 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 我没有考虑到我的图表中,因此我自己修改了一些代码

4

3 回答 3

5

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

看看我最喜欢的 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 
于 2013-05-07T14:44:13.143 回答
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
于 2013-05-07T14:44:52.343 回答
-3

您应该阅读有关表之间的关系。现在我不想给出整个解决方案,但是如果您希望表中的所有数据从 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来指定关系的地方。

于 2013-05-07T14:43:44.743 回答