2012-08-25 2 views
2

Je travaille sur un forum et, comme dans tous les forums, il y a des discussions et des réponses. Ce sont les tableaux que j'utilise dans la base de données pour les stocker:Comment faire une instruction dynamic if dans SQL?

post 
------------ 
id 
user_id 
time 
type 
effective_id 

thread 
------------ 
id 
update_time 
text 
response_number 
deleted 

response 
------------ 
id 
container_id 
text 
deleted 

Le post.type est un enum('thread', 'response'), et le post.effective_id doit correspondre à un thread.id ou un response.id selon ce que le post.type indique.

Comme vous pouvez le voir, je factorise tout ce que les threads et les réponses ont en commun.


Voici le problème que je l'ai rencontré: je veux déterminer si un poste donné a été supprimé (ayant son id que des informations) dans une requête et unique sans déplacer le champ deleted à la table post .

Ce sont les requêtes que j'utiliserais si je savais à l'avance si l'identifiant donné appartient à un thread ou à une réponse.

SELECT thread.deleted 
FROM post INNER JOIN thread ON post.effective_id = thread.id 

ou

SELECT response.deleted 
FROM post INNER JOIN response ON post.effective_id = response.id 

Mais comment puis-je dire dans SQL, "if the post.type is thread then INNER JOIN with thread and get the deleted field, if post.type is response then INNER JOIN with response and get the delete field."? J'aurais besoin d'une sorte de "si" dynamique

Est-ce encore possible de faire avec les conditions spécifiées?

Merci!

Répondre

2

Jetez un oeil à l'affaire dans la requête ci-dessous:

SELECT CASE 
WHEN post.type = 'thread' THEN thread.deleted 
WHEN post.type = 'response' THEN response.deleted 
ELSE 'default' 
END 
FROM post 
LEFT JOIN thread ON post.effective_id = thread.id 
LEFT JOIN response ON post.effective_id = response.id 
+0

C'est exactement ce que je cherchais, merci! – federicot

1

Utilisez deux gauche rejoint:

SELECT IFNULL(thread.deleted, response.deleted) AS deleted 
FROM post 
LEFT JOIN thread ON post.effective_id = thread.id 
AND post.type = 'thread' 
LEFT JOIN response ON post.effective_id = response.id 
AND post.type = 'response'