在我最近开始的一个项目中,嘿嘿嘿嘿。
我有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,我没有把它放到我的图表中因此我自己改变了一些代码
答案 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
指定关系的地方。