[MySQL] JOIN nur, wenn ein bestimmtes Feld einen bestimmten Wert aufweist

suntrop

Erfahrenes Mitglied
Mein kleines Projektmanagement-Tool übersteigt gerade meine aktuellen Fähigkeiten :) Folgendes … ich will zu jedem Projekt speichern, ob entweder alle oder nur bestimmte Personen Zugriff haben. Leider kann ich das nicht so richtig in SQL dolmetschen.

In der Tabelle für Projekte habe ich ein ENUM mit 'all', 'privat', 'selected'. Erstgenanntes sollte klar sein. Zweite Erlaubnis soll nur dem User Zugriff geben, der das Projekt erstellt hat. Und Selected soll in einer anderen Tabelle gespeicherte Zugriffsrechte heranziehen.

Mein Problem ist jetzt, dass ich nicht weiß wie ich beim Auslesen Punkt 2 und 3 prüfe und entsprechende Resultate aus der DB hole.

Das hier ist mein aktueller Versuch
Code:
SELECT id, title

IF(
	p_projects.permission = selected,
		INNER JOIN project_permissions
			ON p_project_permissions.project_id = p_projects.id
		
		WHERE p_project_permissions.user_id = $USERID
)

IF(
	p_projects.permission = privat,
		WHERE p_projects.created_by_user_id = $USERID
)


FROM `p_projects`

Bitte nicht schimpfen, ist mein erster Versuch mit IF ELSE unter MySQL :)

Wäre super, wenn mir jemand helfen könnte.

Grüße
suntrop
 
Willst du jetzt Abfragen, ob ein bestimmter Nutzer auf ein bestimmten Projekt zugreifen kann? Oder was soll als Ergebnis kommen?
 
Das Ergebnis soll sein, dass ich eine Liste aller Projekte erhalte, auf die ein bestimmter User (kommt per PHP, im Code $USERID) Zugriff hat.
 
INNER JOIN project_permissions
ON p_project_permissions.project_id = p_projects.id


Also mir fällt da vor allem auf, dass du zwar die gleiche Tabelle meinst, die aber unterschiedlich heißen?
Desweiteren liest du gar nicht die Art der Rechte/die Rechte selber aus...
Habs auch nicht so mit Mysql, deswegen kann ich dir auch nicht direkt eine Lösung anbieten.
€: Theoretisch kann der Ersteller ja immer auf sein Projekt zugreifen, oder?
€2: Wo findet man die Rechte, die ein bestimmter User hat? Das wäre bei einer selected-permissions Abfrage hilfreich.
€3:
jetzt begreif ich auch so langsam, was du machen willst...
€3:
mal ein Versuch
Code:
SELECT id, title 
FROM `p_projects`
IF(
    p_projects.permission = selected,
        INNER JOIN p_project_permissions
            ON p_project_permissions.project_id = p_projects.id
        
        WHERE p_project_permissions.user_id = '".$USERID.'"
)
 
IF(
    p_projects.permission = privat,
        WHERE p_projects.created_by_user_id = '".$USERID."'
)

inner join nach dem FROM...

gruß
 
Zuletzt bearbeitet:
Sorry, das sind die selben Tabellen, nur das Prefix fehlt.
Richtig, der Ersteller soll immer auf sein Projekt Zugreifen dürfen.

Hier mal meine anderen Versuche …

Code:
SELECT p_projects.id, title, permission, project_id, user_id
FROM  `p_projects`

LEFT JOIN p_project_permissions
  ON ( p_project_permissions.project_id = p_projects.id )



/*
IF( p_projects.permission = selected,user_id=2,1=1)

IF( p_projects.permission = selected, WHERE user_id = 2) 

WHERE
  CASE  WHEN p_projects.permission = 'selected'  THEN  user_id = 2 END

*/
 
Ich denke für diesen Fall wäre ein UNION wesentlich besser als diese IF-Abfragen.

SQL:
SELECT id, title FROM p_projects WHERE permissions = 'all'
UNION
SELECT id, title FROM p_projects WHERE permissions = 'privat' AND created_by_user_id = $USERID
UNION
SELECT id, title FROM p_projects
JOIN (project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
WHERE permissions = 'selected'


Edit: Und falls im Falle von "selected" der Ersteller nicht nochmal extra in der permissions Tabelle auftaucht, kannst du das auch noch mit rein nehmen.


SQL:
SELECT id, title FROM p_projects WHERE permissions = 'all'
UNION
SELECT id, title FROM p_projects WHERE permissions IN ('privat', 'selected') AND created_by_user_id = $USERID
UNION
SELECT id, title FROM p_projects
JOIN (project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
WHERE permissions = 'selected'
 
Zuletzt bearbeitet:
Für was genau willst du die Projekte auslesen?
Liest der Benutzer SEINE Projekte aus?
Liest du die Projekte von bestimmten Benutzern aus (control panel)?
Liest ein anderer Benutzer die Projekte aus (auch von anderen Benutzern), wo er dran arbeiten kann?

kompliziert ich weis...^^

€:
SQL:
SELECT id, title FROM p_projects WHERE permissions = 'all'
UNION
SELECT id, title FROM p_projects WHERE permissions = 'privat' AND created_by_user_id = $USERID
UNION
SELECT id, title FROM p_projects
JOIN (p_project_permissions) ON (p_project_permissions.project_id = p_projects.id AND p_project_permissions.user_id = $USERID)
WHERE permissions = 'selected'
nur den einen tabellennamen richtiggestellt....
 
Zuletzt bearbeitet von einem Moderator:
Mit dem €3 Code erhalte ich diese Fehlermeldung …

SELECT id, title
FROM p_projectsIF( p_projects.permission = selected,
INNER JOIN p_project_permissions ON p_project_permissions.project_id = p_projects.id
WHERE p_project_permissions.user_id =1 )
LIMIT 0 , 30

MySQL meldet:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(
p_projects.permission = selected,
INNER JOIN p_project_permissio' at line 3

… außerdem logt verliert PHPMyAdmin die Verbindung zur Datenbank****** Das hatte ich bisher auch noch nicht :)
 
Ok, das ist nicht gut. also hab damit jetzt nicht viel Erfahrung, könnte mir nur einen Formatierungsfehler vorstellen.

SELECT id, title
FROM p_projects
IF( p_projects.permission = selected,
INNER JOIN p_project_permissions ON p_project_permissions.project_id = p_projects.id
WHERE p_project_permissions.user_id =1 )
LIMIT 0 , 30

vor dem IF war kein Abstand drin..., aber obs daran liegt? Ich bastel zu wenig mit Mysql, dass ich solche fehler ausschließen könnte...
 
An der Stelle wo ihr das "IF" habt, wird eben keines erwartet. Es wird z.B. ein WHERE erwartet. So kann man das IF nicht verwenden.
 

Neue Beiträge

Zurück