2009-03-26 7 views
1

Comment combiner les deux requêtes suivantes pour produire une combinaison des deux?Combinaison de deux requêtes MySQL (une pour sélectionner le contenu d'une autre)

SELECT * 
FROM post_attributes 
WHERE name IN ('title', 'body'); 

SELECT id, url, created_at, name, value 
FROM posts, post_attributes 
WHERE posts.id = post_attributes.post_id 
ORDER BY id; 

L'idée serait d'extraire le numéro de poste, il est URL, le temps qu'il a été créé, le titre et le corps du billet de blog du moteur blogging Chyrp, mais ne pas tenir compte des autres données stockées dans la même base de données . Je pense que j'y vais de la mauvaise façon. Y aurait-il une fonction plus appropriée à utiliser?

+0

À la réflexion, vous avez pas dit que des colonnes appartiennent à quelle table (dans la deuxième requête) – karim79

Répondre

4
SELECT posts.id, posts.url, posts.created_at, posts.name, posts.value 
    FROM posts, post_attributes 
WHERE posts.id = post_attributes.post_id 
AND post_attributes.name IN ('title', 'body') 
ORDER BY id; 

Ajouter un post_attributes.* à la fin si vous voulez que tous les champs de attributs de poste.

+0

MALÉDICTIONS ... à seulement 20 secondes trop lent – belgariontheking

+0

Juste un commentaire. Je pense que votre requête et la requête de @ FerranB généreront deux lignes pour chaque article de blog correspondant (un pour l'attribut title et un pour le corps). Je pense que la requête que j'ai posté entraînera une ligne par article. Je ne sais pas si @nickcarlton se soucie. –

+0

@Jeremy: Bon point. – belgariontheking

2

Vous cherchez ceci:

SELECT id, url, created_at, name, value, post_attributes.* 
    FROM posts, post_attributes 
WHERE posts.id = post_attributes.post_id 
    AND name IN ('title', 'body') 
ORDER BY id; 
0

Je ne sais pas si cela est le plus efficace, mais cela devrait fonctionner (en supposant que post_attributes a une colonne nommée « valeur » qui stocke la valeur d'attribut).

SELECT id, url, created_at, name, value, p_title.value, p_body.value 
FROM posts p 
INNER JOIN post_attributes p_title on p.id = p_title.post_id 
INNER JOIN post_attributes p_body on p.id = p_body.post_id 
ORDER BY p.id; 
0

performances impressionnant:

select p.id, pa.title, pa.body, pa.created_at, pa.name, pa.value from post_attributes pa, posts p where p.id = pa.post_id and (pa.name = 'title' or pa.name = 'body') 
Questions connexes