如何加入此查询?

时间:2014-04-11 19:33:47

标签: mysql sql join

我有两张桌子:

主题,文章和发现

Topics表中,我有:'id', 'title'Articles表中,我有:'id', 'title'Discover表中,我有:'id', 'itemId', 'itemType', 'hOrder'

Discover表中,我想在itemId中存储TopicArticle的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?谢谢!

2 个答案:

答案 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

就我个人而言,我不会以这种方式混合关系。我会使用单独的列。