2010-12-08 32 views
0

J'ai une base de données term. Chaque terme peut être privé ou public.
Les termes sont organisés en project s. Il existe également un tableau user.SQL pour les enregistrements publics privés qui dépendent du projet sélectionné

Si je devais faire un SQL pour récupérer les données en prenant soin du statut public et je sais à l'avance si je dois permettre à public, il ressemblerait à ceci:

SELECT * FROM term
JOIN project ON (project.id = term.id_project)
WHERE term.public = true
(aurait pu être WHERE public, mais plus clair comme ça)

ou

WHERE (term.public = true OR term.public = false) (aurait pu être évitée complètement, mais plus clair comme ça)

mais, chaque combinaison utilisateur-projet (user_project_mm) peut être autorisé ou refusé pour voir des projets privés. Essayer de résoudre droite donne loin quelque chose comme:

SELECT * FROM term
JOIN project ON (project.id = term.id_project)
JOIN user_project_mm ON (user_project_mm.id_project = project.id)
WHERE user_project_mm.id_user = $currentUserID
[[IF user_project_mm.private THEN NOTHING ELSE AND term.public = true]]

Le code à l'intérieur [[]] est manifestement pas SQL. C'est une sorte de réécriture SQL qui est nécessaire ici. La décision d'ajouter ou non AND term.public dépend de chaque champ d'enregistrement de résultat particulier user_project_mm.private.

Je ne veux pas post-traiter avec PHP car cela ruinerait ma pagination faite avec LIMIT et c'est sale quand même. Existe-t-il une solution SQL propre pour cela? Est-ce que je l'ai expliqué assez clairement?

+0

Je veux sélectionner tous les enregistrements (y compris privé) si elle est autorisée pour $ currentUser dans le domaine user_project_mm.private. Je veux sélectionner SEULEMENT les enregistrements publics pour les projets qui ont faux dans le champ user_project_mm.private. – Slawa

Répondre

3
SELECT * FROM term 
JOIN project ON (project.id = term.id_project) 
JOIN user_project_mm ON (user_project_mm.id_project = project.id) 
WHERE user_project_mm.id_user = $currentUserID 
AND (user_project_mm.private = true or term.public = true) 
+0

Ça semble être ça! Je vais essayer de rapporter mes résultats bientôt. – Slawa

0

@JackPDouglas a eu une très bonne idée et c'est tellement simple! Le résultat final ressemble à ceci:

AND (user_project_mm.private OR (!user_project_mm.private AND term.public))

+0

Je dirais que «X OR (PAS X ET Y)» est moins clair que «X OU Y» (sauf si «X» peut être «NULL» - est-ce possible?) –