2010-03-21 5 views
0

i ont une table de photos: pictures(articleid,pictureurl)Syntaxe mysql utilisant l'aide IN!

Et une table d'articles: articles(id,title,category)

Alors, brièvement, chaque article a une image et je lier des images à l'article en utilisant la colonne articleid. Maintenant, je veux sélectionner 5 photos d'articles dans la catégorie politic.

Je pense que cela peut être fait en utilisant IN, mais je ne peux pas comprendre comment le faire.

Note: S'il vous plaît seulement une requête, parce que je peux le faire en sélectionnant des articles d'abord puis en obtenant les images.

Merci

+2

Si chaque article a une image, pourquoi ne pas mettre la colonne pictureurl dans le tableau des articles? Rien n'est gagné en normalisant dans ce cas. –

Répondre

1

Si vous êtes à la recherche d'une place d'une requête INJOIN ceci est une alternative à la requête d'Alex:

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

Bien sûr, c'est beaucoup moins efficace qu'un JOIN donc il ne devrait pas être utilisé dans un cas aussi simple que celui-ci. – Duncan

+0

D'accord, mais c'est ce qu'il a demandé. –

+1

@St. John: J'ajoutais juste l'avertissement standard. J'ai vu beaucoup trop de code de production qui a été évidemment écrit par quelqu'un qui n'a jamais dit pourquoi vous ne devriez pas faire les choses de cette façon :) – Duncan

2

Pour obtenir cinq photos des articles dans une catégorie, vous pouvez le faire:

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

Vous pourriez envisager de reformuler la question un peu.

0

Vous ne avez pas vraiment besoin d'utiliser IN pour cela. IN sert lorsque vous imbriquez des requêtes ou lorsque vous avez un ensemble connu de valeurs à vérifier.

Pour sélectionner 5 images aléatoires dans la catégorie politics:

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

Réécriture des éclaircissements (voir les commentaires):

Si vous voulez garder vos critères REJOIGNEZ séparés de vos critères SELECT, vous pouvez écrire quelque chose comme le ci-dessous:

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

Je trouve l'intention un peu clair quand il est écrit comme ça, et peut-être juste moi, mais je J'ai rencontré des requêtes complexes écrites dans le formulaire SELECT * FROM a, b, c qui fonctionnait sous MySQL 4 et qui étouffent MySQL 5, alors que le format ci-dessus fonctionne bien avec les deux. En outre, si vous utilisez des noms de colonne ID uniformes pour la conformité et pour éviter de vous confondre dans des scénarios plus complexes, vous pouvez utiliser la clause USING à la place. Donc si la colonne d'articles ID est aussi appelée articlesid, le JOIN pourrait être écrit comme suit:

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

La clause 'USING' requiert le même nom de colonne dans les deux tables; Malheureusement, dans cet exemple, ils sont différents. Par conséquent, vous devez utiliser une clause ON à la place. –

+0

@Jonathan Leffler: C'est pourquoi j'ai commencé ma réponse en disant que l'utilisation de noms de colonnes uniformes vous permettrait de le faire :) – Duncan

+0

OK: oui, l'information est là, bien qu'elle ne soit pas une réponse directe à la question mais plutôt une réponse à une question légèrement différente. Je plaide coupable de lire le SQL plus dur que le commentaire. Vous auriez pu éviter le problème - dans la mesure où c'est un problème - et obtenu mon up-vote (pour utiliser la notation JOIN contrairement à tout le monde) en donnant la notation ON et en expliquant le schéma révisé et la notation USING. Vous pouvez toujours obtenir mon vote si ... –