2013-01-18 21 views
0

假设一个网站根据它们发布的媒体格式对流行故事进行分类。其数据库包含以下表:从表A获取项目,该项目通过表B链接到表C.三重联接?

stories table

links table

enter image description here

应该使用什么样的查询或查询的检索中,比如说形式发布的所有故事标题,电影?

我认为做这样的事情的,但怀疑有一个更好的方法:

SELECT `story_id` 
FROM `links` INNER JOIN `media` 
    ON `links`.`medium_id` = `media`.`medium_id` 
    WHERE `media`.`medium_name` = :medium_name" 

for every retrieved story_id 
{ 
    SELECT `story_summary` FROM `stories` WHERE `story_id` = :story_id 
} 

任何帮助,将不胜感激!

回答

0
select s.story_title 
from stories s, links l, media m 
where m.medium_name = 'movie' and 
s.story_id = l.story_id and 
l.medium_id = m.medium_id 

这实质上与raheel发布的查询基本相同,只是语法不同。 故事和中型表格是不是直接连接在一起的原因?你的查询和db可以简化。

+0

哦,那可能是 - 我不是专家,不远。如果每个故事可以有多种媒体形式,这将是设置表格的最佳方式。 这个语法对我来说似乎简单得多,但是到目前为止我还没有得到它在我的项目中的工作......仍在尝试。 – Chris

+0

还没有在我的PHP脚本中工作,但如果我直接在PHPMyAdmin中运行查询,它完美的工作。与(更复杂的?)JOIN相比,这种方法有什么缺点吗?我从来没有真正使用JOIN,我必须承认,在多个查询中,总是“手动”地完成某些事情。 – Chris

+1

我的查询是一个较老的语法,暗示了连接的类型。查询@raheel_shan发布是一个新的语法,明确定义了连接类型。如果你要学习一个我会用更新的语法。 –

1

尝试与此查询,而不是(我增加了第三行和最后一个):

SELECT `story_id` FROM `links` 
INNER JOIN `media` ON `links`.`medium_id` = `media`.`medium_id` 
inner join stories on stories.story_ID=links.story_id 
WHERE `media`.`medium_name` = :medium_name 
and `story_summary`.`story_id` in (:all_the_story_id) 

all_the_story_id没有把所有的story_id,看看到mysql in

如果您额外加入您将拥有所有您需要的信息,而且您无需为每个结果进行查询

1
SELECT 
    s.story_title 
FROM MEDIA as m 
LEFT JOIN LINKS as l ON l.medium_id = m.medium_id 
LEFT JOIN STORIES as s ON s.story_id = l.story_id 
WHERE m.medium_name = 'movie' 
+0

按照你的和Scotty Boy的建议去做。你能否向我解释为什么需要一个左连接?我发现这种变化更具可读性,使用INNER JOIN似乎很有效:http://codepad.org/rBlxBIyU – Chris

+0

LEFT和INNER之间有一点区别。 Inner获取左表和右连接表中存在于两个表中的记录,而左连接始终获取左表结果,如果记录不存在,则右表获取空结果。但是使用inner,记录必须存在于这两个表中 –