我有两张桌子:
主题,文章和发现
在Topics
表中,我有:'id', 'title'
在Articles
表中,我有:'id', 'title'
在Discover
表中,我有:'id', 'itemId', 'itemType', 'hOrder'
在Discover
表中,我想在itemId
中存储Topic
或Article
的ID。在itemType
我会有一个' p
'或者{' a
'取决于它是什么(分别是主题或文章)。
我的问题是当我试图提取值时。我想制作一个JOIN
来获取Topics
Discover
,如果主题位于hOrder
表中,它会给我SELECT *
FROM playlists p
LEFT JOIN homepage_discover h
ON p.id = h.itemId
WHERE h.itemType = 'p'
。
我试过这个
{{1}}
我试过INNER,LEFT,RIGHT加入,没有一个是我正在寻找的。会是什么类型的JOIN?谢谢!
答案 0 :(得分:2)
使用外连接时,where子句值只能与具有要返回的所有记录的表相关。否则,您将限制外部联接所需的空值。这可以通过在where子句中使用“和null符号”或“向连接本身添加限制条件”来实现。
其工作原因与连接中的执行顺序和生成的cartean产品有关。当系统将T连接到D时,它会排除itemtype而不是p的任何内容。然后执行外连接,从而不消除主题中的记录。当在where子句中完成此操作时,已经发生了连接,因此对itemtype p计算所有记录。其中一些将被排除在外,因此消除了外部连接,因此使用一个或者为null的工作原理!
SELECT *
FROM Topics T
LEFT JOIN Discover D
on T.ID = D.itemID and d.itemType = 'p'
OR
SELECT *
FROM Topics T
LEFT JOIN Discover D
on T.ID = D.itemID
WHERE (D.itemType = 'p' or D.itemType is null)
答案 1 :(得分:0)
如果您真的想这样做,可以使用
SELECT
t.*,
d.hOrder
FROM
topic t
LEFT JOIN -- we want all topics
discover d
ON
t.id = d.itemId
AND
d.itemType = 'p' -- because 'p' indicates a topic
就我个人而言,我不会以这种方式混合关系。我会使用单独的列。