2017-01-16 6 views
0

Ich versuche, unter Abfrage zu konvertieren über JoinsConvert Sub-Abfrage in Joins

SELECT DISTINCT req.* 
FROM request req 
WHERE (req.user_id IN (
      SELECT id from user where id in (SELECT user_id FROM team_member team WHERE team.team_id IN ('344', '723')) and user.active = 1 
) 
OR req.user_id IN (
    SELECT id from user where id in (SELECT approved_employee_id from approver where approver_id = '269') and user.active = 1 
)) 
    AND req.status = 'pending'; 

124 Datensätze zurückgibt.

Ich habe unten Abfrage schrieb über schließt sich aber nicht funktioniert,

SELECT DISTINCT req.* 
FROM request req 
    LEFT JOIN user u ON u.id = req.user_id AND u.active = 1 
    LEFT JOIN team_member team ON team.user_id = u.id AND team.team_id IN ('344', '723') 
    LEFT JOIN approver app ON app.approver_id = u.id AND app.approver_id = '269' 
AND req.status = 'pending'; 

gibt mehr als 500 Datensätze.

zwei Probleme mit diesem Joins, es enthält auch Anfragen, bei denen der Status nicht aussteht.

unten ist das Schema

I unten Tabellen

tbl_approver = 
id, 
approver_id (FK tbl_user), 
approver_team_id (FK tbl_team), 
approved_employee_id (FK tbl_user) 

tbl_team_mambers = 
id, 
team_id (FK), 
user_id (FK) 

tble_user = 
id, 
email, 
username 
active 


tbl_request = 
id, 
user_id, 
status 
  • Teams Mitglieder: Ein Benutzer ist Mitglied mehrerer Teams.
  • Approver:
    • Für jedes Team gibt es einen Genehmiger, der auch Mitglied dieses Teams ist.
    • kann ein Mitarbeiter unabhängig vom Team direkt genehmigen.
  • Anfrage: Inventar Anfragen vom Benutzer

Hinweis: als Genehmiger, kann ich Mitglied von vielen Teams, aber nur Genehmiger einiger Teams. oder ein Angestellter auch.

Frage gesucht: als Genehmiger möchte ich alle Anfrage von meinen Teams, die ich Genehmiger bin.

+1

Es würde helfen, wenn Sie Ihr Schema enthalten, Beispieldaten, Ausgang und erwartete Ausgabe. – shmosel

+0

jQuery ist eine Javascript-Bibliothek und hat nichts mit mysql/sql zu tun ... versuchen Sie, Fragen passend zu markieren – charlietfl

+0

@shmosel sehen Sie die aktualisierte Frage jetzt. –

Antwort

0

beobachten die LEFT JOIN Syntax, hier ist der visual expression of joins

SELECT DISTINCT req.* 
FROM request req 
LEFT JOIN user u ON u.id = req.user_id AND u.active = 1 
... 

Dadurch werden alle verschiedene Datensätze aus request auswählen und JOIN sie Benutzer. Die join_condition nach ON betrifft nur die Join-Beziehung.

Wenn für die rechte Tabelle im ON- oder USING-Teil in einem LINKEN JOIN keine übereinstimmende Zeile vorhanden ist, wird für die rechte Tabelle eine Zeile mit allen auf NULL gesetzten Spalten verwendet.

Join syntax from Mysql Documentation

Wenn Sie wirklich verwenden LEFT JOIN wollen von request alle Datensätze zu filtern, sollten Sie bewegen die condition_expr zu WHERE

SELECT DISTINCT req.* 
FROM request req 
LEFT JOIN user u ON u.id = req.user_id 
... 
WHERE u.active = 1 
AND ... 

Wenn Sie nur request benötigen, die die Bedingung Benutzer beitreten erfüllt sollten Sie die Verwendung von Join anstelle von LEFT JOIN in Betracht ziehen.

1

Für korrekte Ergebnisse von join 's müssen Sie alle verbundenen "Tabelle" nur eine Zeile für user_id zurückgeben. Verwenden Sie bei Bedarf nicht nur left Zeilen, die in allen Tabellen vorhanden sind.

SELECT req.* 
    FROM request req 
    JOIN user ON user.id=req.user_id 
    JOIN (
     SELECT distinct approved_employee_id as user_id from approver where approver_id = '269' 
     UNION 
     SELECT distinct user_id FROM team_member team WHERE team.team_id IN ('344', '723') 
     ) A ON req.user_id=A.user_id 
where user.active = 1 
    AND req.status = 'pending'; 

Oder bei Bedarf nur noch „echte Tabelle“:

SELECT DISTINCT req.* 
    FROM request req 
    JOIN user u ON u.id = req.user_id AND u.active = 1 
    LEFT JOIN team_member team ON team.user_id = u.id AND team.team_id IN ('344', '723') 
    LEFT JOIN approver app ON app.approver_id = u.id AND app.approver_id = '269' 
WHERE req.status = 'pending' 
    AND (team.user_id is not null OR app.approver_id is not null)