2010-06-24 166 views
1

我试图做一个查询来过滤来自一个表的行,然后在另一个表上结合结果,然后过滤掉其他的行。加入的子查询

这里是我写的查询:

SELECT * 
    FROM (SELECT media.id AS id2, media.flagged AS flagged2, media.item_status AS status2 
      FROM media 
     WHERE flagged2 != 'nsfw' 
      AND status2 != 'deleted' 
    ORDER BY id2 DESC LIMIT 0,5) 
    JOIN media on info.mid = media.id 
WHERE info.topic = 'food_drink' 
    OR info.topic='cooking' 
GROUP BY info.mid 

我觉得我很接近得到查询工作,但我不断收到消息,“每一个派生表必须有自己的别名。”我google了这个,从我读过的东西,我需要别名的部分子查询,我尝试过,但我仍然无法得到它的工作。

+0

只是一个简单的问题......你在哪里得到“信息”?它是别名还是表格? – hallie 2010-06-24 01:23:46

+0

@hallie:鉴于Eric没有使用表别名,我相信这是一张表。埃里克将不得不让我们知道,如果引用到'INFO'应该在这个查询中,否则它们如何与派生表相关... – 2010-06-24 01:38:00

+0

我怀疑......在info.mid = media.id上加入媒体。 ..实际上应该是...加入info.mid = media.id的信息** ... – 2010-06-24 11:10:58

回答

3

用途:

SELECT * 
    FROM (SELECT media.id AS id2, media.flagged AS flagged2, media.item_status AS status2 
      FROM media 
     WHERE flagged2 != 'nsfw' 
      AND status2 != 'deleted' 
     ORDER BY id2 DESC LIMIT 0, 5) x 
    JOIN media on info.mid = media.id 
WHERE info.topic = 'food_drink' 
    OR info.topic='cooking' 
GROUP BY info.mid 

x,只是支架之外,但在连接前?这就是错误所在。 FROM和JOIN之前括号内的内容是一个派生表(AKA内联视图),MySQL要求您为其指定一个表别名。然后,当你从里面引用任何列时,你会使用x.id2/etc。

+0

啊,这是有道理的。我认为我不得不别名的部分在子查询中。只是根据您的输入重新编写了查询,并且工作完美! – Eric 2010-06-24 11:58:04