SQL для публичных частных записей, которые зависят от выбранного проекта - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть term БД. Каждый термин может быть частным или публичным.
Термины организованы в project с.
Также есть таблица user.

Если бы я создал SQL для извлечения данных, заботящихся о публичном статусе, и я заранее знаю, нужно ли мне разрешить публичный доступ, это выглядело бы так:

SELECT * FROM term<br> JOIN project ON (project.id = term.id_project)<br> WHERE term.public = true (могло бы быть WHERE public, но так понятнее)

или

WHERE (term.public = true OR term.public = false) (мог быть полностью пропущен, но понятнее)

Но каждая комбинация пользователь-проект (user_project_mm) может быть разрешена или запрещена для просмотра частных проектов. Попытка решить сразу дает что-то вроде:

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

Код внутри [[]] явно не SQL. Это своего рода переписывание SQL, которое необходимо здесь. Решение о добавлении AND term.public или нет зависит от каждого конкретного поля записи результата user_project_mm.private.

Я не хочу постобработать с PHP, так как это разрушит мою нумерацию страниц, сделанную с помощью LIMIT, и это в любом случае будет грязно. Есть ли для этого чистое решение SQL? Я объяснил это достаточно ясно?

Ответы [ 2 ]

3 голосов
/ 08 декабря 2010
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 голосов
/ 09 декабря 2010

@ У ДжекДугласа была очень хорошая идея, и это так просто!Конечный результат выглядит так:

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

...