只有当条件满足时,SQL才会进行连接。

3
我有一个网站,用户可以分享内容。
我有一张名为 "Posts" 的表格,其中包含两列; "Type" 和 "Media"。 "Type" 列用于识别帖子的类型,即是否包含任何照片或是否只是普通帖子。如果它包含照片,则 "Type" 列将具有值 "b",如果是没有照片的空白帖子,则该值将为 "a"。如果 "Type" 的值等于 "b",则 "Media" 列将具有ID整数作为值,以标识附加到帖子的照片。
在单独的表格中,名为 "Photos" ,上传的每张照片都会被赋予一个唯一的ID。该唯一ID被放置在“帖子”表格中“Media”的值中。
如果 “Type” 的值等于“b”,我想在我的SQL语法中进行INNER JOIN。
请问有谁能帮我指出正确的方向?

这太啰嗦了。但只需添加 Where Type = 'b' - Siyual
但是当它不返回任何具有“type=a”的帖子时。 - Frank
2
啊,我明白了 - 在这种情况下,您需要使用第二个 On 子句和 Type ='b'Left Join - Siyual
1
我提出的问题是“为什么”。如果有适当的外键关系,如果媒体中存在 id,则照片必须始终存在,因此您甚至不需要检查类型(因此,type 列是过时的)。此外,我建议将 PostId 与图片一起存储,而不是反过来,甚至创建一个连接表,否则帖子只能有一个图片,这似乎是有限制的。 - GolezTrol
4个回答

9
听起来你确实想要进行左连接。左连接将会给你数据,如果它存在的话,但是如果没有相应的照片数据,则会显示空值。
也许可以像这样做:
Select *
From Posts
   Left Join Photos on Posts.MEDIA = Photos.MEDIA 
                    and Photos.Type = 'b'

如果这只是文本,它会像这样:

。涉及IT技术方面的内容。

Type    Media    Photo
a       w/e
b       w/e      cats.jpg

1

正如Philip所建议的那样,最好的方法是使用外连接,但如果您真的想避免外连接,您需要使用子查询...

 SELECT Type,
    (Select case when p.type = 'p' 
            then photo [or whatever column you want] else null end 
     from Photos where id = p.Media) photo
 FROM posts p

啊,这实际上是一个非常好的方法。我经常在Select语句中使用子查询,特别是当它仅用于输出而不用作条件时。在我的观点中,这样更容易重复使用。 - Phillip

0

join语句中,您可以有多个条件:

SELECT     *
FROM       posts
INNER JOIN photos ON posts.media = photos.id AND 
           posts.type = 'b'

0
您正在寻找一个左连接(left join),类似下面的内容。
select * from posts p
left join photos pp on p.media = pp.media
and p.type = 'b'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接