Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从表A获取项目,表A通过表B链接到表C。三重连接?_Mysql_Database_Pdo - Fatal编程技术网

Mysql 从表A获取项目,表A通过表B链接到表C。三重连接?

Mysql 从表A获取项目,表A通过表B链接到表C。三重连接?,mysql,database,pdo,Mysql,Database,Pdo,假设一个站点根据发布的媒体格式对流行故事进行分类。其数据库由以下表格组成: 应该使用何种查询来检索以电影等形式发布的所有故事标题? 我曾想过这样做,但怀疑有更好的方法: SELECT `story_id` FROM `links` INNER JOIN `media` ON `links`.`medium_id` = `media`.`medium_id` WHERE `media`.`medium_name` = :medium_name" for every retrieve

假设一个站点根据发布的媒体格式对流行故事进行分类。其数据库由以下表格组成:

应该使用何种查询来检索以电影等形式发布的所有故事标题?

我曾想过这样做,但怀疑有更好的方法:

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
}

任何帮助都将不胜感激

试试这个查询(我添加了第三行和最后一行):

所有的故事id那里放着所有的故事id,看看

如果你做了一个额外的连接,你将拥有你需要的所有信息,并且你不需要对每个结果进行查询

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'
这与raheel发布的查询基本相同,只是语法不同。
故事表和中间表不直接连接有什么原因吗?您的查询和数据库可以简化。

哦,那可能是-我不是专家,目前还不是。我想如果每个故事都可以有多种媒体形式,这将是设置表格的最佳方式。这个语法对我来说似乎简单得多,但到目前为止我还没有在我的项目中使用它。。。仍在尝试。在我的PHP脚本中还没有运行它,但是如果我直接在PHPMyAdmin中运行查询,它将非常有效。与(更复杂的?)连接相比,这种方法有什么缺点吗?我必须承认,我以前从未真正使用过联接,我总是在多个查询中“手动”执行操作。我的查询是一种较旧的语法,联接的类型是隐含的。查询@raheel_shan posted是一种新语法,它显式定义了连接类型。如果你想学习一个新的语法,我会选择新的语法。有一段时间没有学习php了,但是php查询可能更喜欢第3行中的电影是双引号:“电影”?@ScottyBoy你应该知道这是一个cartisian产品,必须避免,连接更快,而这个旧的syntex更慢。此外,除非你限制他们在何处,否则卡蒂西亚将获得不足的结果。按照你和Scotty Boy的建议进行。你能给我解释一下为什么需要左连接吗?我发现这种更具可读性的变体似乎在使用内部联接时工作得很好:左侧和内部联接之间有一点区别。内部获取同时存在于两个表中的记录意味着存在于左联接表和右联接表中,而左联接总是获取左表结果,如果记录不存在,则获取关于右表的空结果。但使用内部,两个表中都必须存在记录
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'
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