2014-01-24 38 views
0

这实际上是一个由两部分组成的问题,但为了不混淆,我将分成两个实际问题。这一个是关于选择在多到很多相关的表基于值的行创建正确的SQL语句:根据多对多关系选择SQL查询

enter image description here

现在的问题是:什么是让所有的绝对简单的方法resources其中例如metadata.category =主题AND该类别的相应metadata.value ='介绍'?我确信这可以通过很多不同的方式完成,但我是SQL的新手,所以请尽可能提供最简单的方法...(如果您可以简单地描述语句在纯英语也会很棒,我已经看过SQL的介绍,但是我没有发现(对于初学者)进入这些多对多的选择。)

回答

1

最简单的方法是使用EXISTS子句。我更熟悉MSSQL,但这应该是接近

SELECT * 
FROM resources r 
WHERE EXISTS (
    SELECT * 
    FROM metadata_resources mr 
     INNER JOIN metadata m ON (mr.metadata_id = m.id) 
    WHERE mr.resource_id = r.id AND m.category = 'subject' AND m.value = 'introduction' 
) 

翻译成英文,它是“回到我的所有记录这个子查询返回的一个或多个行,但不返回数据的那些行”。该子查询通过使用外部行作为谓词值的谓词mr.resource_id = r.id与外部查询相关联。

我敢肯定,你可以围绕谷歌为EXIST声明

+0

好,感谢更多的例子,但我一直没能使其工作......如果这是MSSQL和MySQL我不之间的差异不知道,但我无法修复它... – Anders

+0

您可以尝试删除别名并执行完全限定的表名(将rx更改为resources.x,mr.x = metadata_resources.x等)。我敢肯定,mysql支持exists条款,虽然 –

+0

你也可以尝试'选择1'在存在,而不是'select *' –