2010-12-08 2 views
0

나는 term DB를가집니다. 각 학기는 개인 또는 공개 일 수 있습니다.
용어는 project으로 구성됩니다.
user 테이블도 있습니다.선택된 프로젝트에 따라 달라지는 공개 개인 레코드의 SQL

나는 대중 상태 돌보는 데이터를 검색하는 SQL을했다 그리고 나는 그것이 같을 것이다 공공 허용해야하는지 여부를 사전에 알고있는 경우 :

SELECT * FROM term
JOIN project ON (project.id = term.id_project)
WHERE term.public = true
(WHERE public을 수 있었다하지만,)이 같은 명확한

또는

WHERE (term.public = true OR term.public = false)()이 같은

그러나, 각 사용자 프로젝트의 조합을 완전히 생략하지만, 분명 한 수 (user_project_mm)는 비공개 프로젝트를 보거나 허용하지 않을 수 있습니다.

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]]

[[]] 내부의 코드는 분명히 SQL되지 않습니다 : 바로 해결하기 위해 노력하는 것은 뭔가를 얻을 수 있습니다. 이것은 여기서 필요한 일종의 SQL 재 작성입니다. AND term.public을 추가할지 여부는 각 특정 결과 레코드 필드 user_project_mm.private에 따라 결정됩니다.

PHP로 후 처리하고 싶지 않습니다. 이렇게하면 LIMIT로 끝난 페이지 매김이 망가질 것이며 어쨌든 더러운 것입니다. 거기에 깨끗한 SQL 솔루션이 있나요? 내가 충분히 명확하게 설명 했습니까?

+0

나는 그것이 user_project_mm.private 필드에 $ currentUser 허용 않다면 (개인 포함) 모든 레코드를 선택합니다. user_project_mm.private 필드에 false가있는 프로젝트에 대해서만 공용 레코드를 선택하고 싶습니다. – Slawa

답변

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

그럴 것 같습니다! 나는 곧 나의 발견을 시도하고보고 할 것이다. – Slawa

0

@ JackPDouglas는 매우 좋은 아이디어를 가지고 있으며 매우 간단합니다. 최종 결과는 다음과 같습니다

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

+0

'X 또는'NOT X '가'X OR Y'보다 덜 분명하다고 말할 수 있습니다 ('X'는'NULL' 일 수 있습니다 - 가능합니까?). –

관련 문제