2011-05-03 2 views
1

J'ai une table appelée post:Sélection d'une valeur d'une autre ligne: mysql

title (NULL), content, parent_id (NULL) 

Le titre est nul parce que j'utiliser pour les discussions et les réponses (réponses ne sont pas un titre et les discussions n'ont pas parent).

Dire que je veux sélectionner toutes les réponses à poster x, ou un nombre n de réponses:

SELECT * FROM post 
WHERE title IS NULL 
AND parent_id = x 

ou,

SELECT * FROM post 
WHERE title IS NULL 
AND parent_id IS NOT NULL 
LIMIT 0, 30 

Comment puis-je choisir aussi le titre d'une réponse? Dire par exemple si je sélectionne la réponse numéro 5 et que c'est une réponse à l'ID poste # 2 (c'est-à-dire a parent_id de 2), comment puis-je sélectionner le titre du numéro 2?

Je ne veux pas utiliser une boucle foreach dans mysql.

Espérons que cela a du sens.

Merci.

+0

-vous savoir si ce serait plus d'un niveau profond? Comme cela a déjà été mentionné, une seule jointure résoudra votre problème si les réponses ne peuvent être ajoutées qu'à un message avec un titre (c'est-à-dire pas une autre réponse). –

Répondre

1

En supposant que votre structure de la table Poster ressemble:

+-----+------------+-----------------+----------+ 
| id | parent_id | title   | content | 
+-----+------------+-----------------+----------+ 
| 1 | NULL  | Post #1 Title | ...  | 
+-----+------------+-----------------+----------+ 
| 2 | NULL  | Post #2 Title | ...  | 
+-----+------------+-----------------+----------+ 
| 3 | 1  |     | ...  | 
+-----+------------+-----------------+----------+ 
| 4 | 2  |     | ...  | 
+-----+------------+-----------------+----------+ 

Vous devez utiliser une jointure:

SELECT 
    *, parent.title AS parent_title 
FROM 
    post 
LEFT JOIN 
    post as parent ON parent.id = post.parent_id 
WHERE 
    post.id = 4 

qui sélectionnerait id post = 4 et vous obtenez le titre de message id = 2 stocké dans le champ parent_title

+0

'# 1052 - Colonne 'id' dans where clause est ambiguë' – jonnnnnnnnnie

+0

Mis à jour mon code pour corriger l'erreur. – stevecomrie

1

COALESCE retours première valeur d'une liste d'arguments qui ne soit pas nul.

SELECT post.content, COALESCE(post.title, parent.title) AS title 
    FROM post 
LEFT JOIN post AS parent 
     ON post.parent_id = parent.id 
    WHERE post.parent_id = 123 
1

Je me joindrais à partir de votre table de courrier dans votre tableau de poste. C'est marrant. (Cela suppose que votre table de poste a une colonne id, ce qui correspond à PARENT_ID)

enfant SELECT. *, Parent.title de l'enfance post REJOIGNEZ parent poste ON (child.parent_id = parent.id)

Questions connexes