2010-03-21 72 views
0

我有一个图片表:pictures(articleid,pictureurl)使用IN的Mysql语法帮助!

而一个文章表:articles(id,title,category)

所以,简单地说,每一篇文章都有一个画面,我用articleid列文章链接的图片。现在我想选择politic类别中的5篇文章。

我认为可以使用IN完成,但我不知道如何去做。

注意:请只有一个查询,因为我可以通过首先选择文章然后获取图片。

感谢

+2

如果每篇文章都有一个形象,为什么不把pictureurl列在文章表?在这种情况下,归一化没有任何好处。 – 2010-03-21 22:33:56

回答

1

如果你正在寻找一个IN查询,而不是一个JOIN这是亚历克斯的查询替代:

SELECT pictureurl 
    FROM pictures 
    WHERE arcticleid IN (SELECT id FROM articles WHERE category='politic') 
    LIMIT 5 
+0

当然,这比JOIN效率低得多,所以不应该用在像这样的简单情况下。 – Duncan 2010-03-21 22:51:00

+0

同意,但这就是他要求的。 – 2010-03-21 23:17:46

+1

@St。约翰:我只是添加了标准免责声明。我看过太多的生产代码,明显是由某人从未被告知的,为什么你不应该这样做:) – Duncan 2010-03-22 00:49:38

2

要想从文章五张图片在一个类别,你可以这样做:

SELECT pictures.pictureurl 
    FROM articles, pictures 
WHERE articles.id = pictures.articleid AND articles.category = 'politic' 
ORDER BY [your sort criteria] 
LIMIT 5; 

你可以考虑改写这个问题有点。

0

你并不真的需要使用IN这一点。 IN用于嵌套查询或当您有一组已知的值进行检查时。

要选择politics 5类随机图像:

SELECT pictureurl FROM articles, pictures WHERE pictures.articleid = articles.id AND articles.category = 'politics' ORDER BY RAND() LIMIT 5 
1

改写澄清(见注释):

如果你想保持你的加入,从你选择的标准分离的标准,你可以写像下面:

SELECT pictureurl 
FROM pictures 
JOIN articles ON id = articleid 
WHERE category LIKE 'politics' 
ORDER BY RAND() 
LIMIT 5 

我找到的意图时,它写的稍微清楚,也许这只是我,但我遇到了在MySQL 4下工作的SELECT * FROM a, b, c表单中写入的复杂查询,这些查询会扼杀MySQL 5,而上述格式与两者都可以正常工作。另外,如果您使用统一的ID列名进行符合性检查,并且为了避免在更复杂的情况下让自己感到困惑,则可以使用USING子句代替。所以,如果文章ID列又称articlesid,可以将连接写成像这样:

SELECT pictureurl 
FROM pictures 
JOIN articles USING (articleid) 
... 
+0

'USING'子句在两个表中都需要相同的列名;不幸的是,在这个例子中,它们是不同的。因此,您必须改用ON子句。 – 2010-03-21 23:12:28

+0

@Jonathan Leffler:这就是为什么我开始我的答案,说使用统一的列名将允许你这样做:) – Duncan 2010-03-22 00:04:38

+0

好的:是的,信息在那里,虽然它不是直接回答问题,而是答案到一个稍微不同的问题。我认为阅读SQL比评论更难。你可以避免这个问题 - 只要它是一个问题 - 通过给出ON表示法然后解释修订后的模式和USING表示法,就可以避免这个问题 - 并得到我的最高票数(对于使用JOIN表示法不同于其他人)。如果...你仍然可以得到我的最高票数 – 2010-03-22 00:21:50