Il a probablement besoin d'être peaufiné pour renvoyer les résultats corrects, mais j'espère que vous avez saisi l'idée :
SELECT ft1.task, COUNT(ft1.id) AS count
FROM feed_tasks ft1
LEFT JOIN pages p1 ON ft1.type=1 AND p1.id = ft1.reference_id
LEFT JOIN urls u1 ON ft1.type=2 AND u1.id = ft1.reference_id
WHERE COALESCE(p1.id, u1.id) IS NOT NULL
AND ft1.account_id IS NOT NULL
AND a1.user_id = :user_id
Modifier :
Une petite note sur CASE...END
. Votre code d'origine ne s'exécute pas car, contrairement à PHP ou JavaScript, le SQL CASE
n'est pas une structure de contrôle de flux qui permet de choisir quelle partie du code sera exécutée. Au lieu de cela, il renvoie une expression. Vous pouvez donc faire ceci :
SELECT CASE
WHEN foo<0 THEN 'Yes'
ELSE 'No'
END AS is_negative
FROM bar
... mais pas ça :
-- Invalid
CASE
WHEN foo<0 THEN SELECT 'Yes' AS is_negative
ELSE SELECT 'No' AS is_negative
END
FROM bar