2016-05-25 10 views
1

Ich schreibe eine Abfrage, um Daten aus einer Tabelle mit dem Namen contracts mit einer Verknüpfung zu der Tabelle user_data oder teams zu holen. Die Tabelle contracts hat eine Spalte mit dem Namen contracteeType, in der ich als bedingte Variable für das Argument verwenden möchte. In PHP-Code ausgedrückt, würde dies als Folgendes geschehen:MySQL - Case/If-Anweisungen

if ($contracteeType === 'user') { 
    // SELECT data FROM user_data table 
} else { 
    // SELECT data FROM teams table 
} 

ich versucht habe, die Erforschung dieses, und ich kam in einer CASE-Anweisung Lösung für das Problem, aber es scheint nicht auf meinem Server zu arbeiten, . Im Folgenden ist das, was ich hatte, kommt mit:

SELECT * 
FROM contracts 
CASE 
    WHEN contracts.contracteeType = 'user' 
    THEN 'user_data' 
    WHEN contracts.contracteeType = 'team' 
    THEN 'teams' 
END as tableName 
CASE 
    WHEN contracts.contracteeType = 'user' 
    THEN 'userID' 
    WHEN contracts.contracteeType = 'team' 
    THEN 'teamID' 
END as colName 
INNER JOIN tableName 
ON tableName.colName = '.$contractID 

Wie kann ich diese Aufgabe mit meiner Abfrage durchführen und hole Daten aus einer Tabelle auf dem Wert von einem anderen abhängig?

+0

Haben Sie Ihre mysql Fehlerprotokolle überprüft? Ihre Syntax weist Fehler auf. –

+3

Diese Art von Problem * kann * schlechtes Design anzeigen – Strawberry

+1

Nein, Sie können keine bedingte Tabellenauswahl bei Abfrage und mehr haben, wenn dies etwas benötigt, dann müssen Sie gespeicherte Prozedur mit Prepare-Anweisung mit dynamischen Tabellennamen verwenden. –

Antwort

1

Die einzige Möglichkeit, ein "Wenn" für Sie arbeiten zu sehen, ist eine gespeicherte Prozedur zu verwenden. Ich finde Ihre Frage etwas verwirrend, aber ich bin mir sicher, dass Sie sie lösen können, indem Sie eine gespeicherte Prozedur erstellen und aufrufen.

Dieser Ansatz hat einige Nachteile (viel Code, anders als eine einfache Abfrage), aber es hat viele gute Punkte (sicher, schnell wie vorkompiliert und unendlich flexibel für die Logik vom Typ "PHP").

Dies ist ein Verfahren Beispiel gespeichert ...

DELIMITER // 

DROP PROCEDURE IF EXISTS MyProcedure; // 
CREATE PROCEDURE MyProcedure() 
BEGIN 

SET @MyVarA = (SELECT cola FROM tablea); 
SET @MyVarB = (SELECT colb FROM tableb); 

IF @MyVarA = 'a' AND @MyVarB = 'b' THEN 
    SELECT A FROM B; 
END IF 

IF @MyVarA = 'd' AND @MyVarB = 'e' THEN 
    SELECT D FROM E; 
END IF 

END; // 
1

UNIONs in kleinen Dosen nur gut sind. Das Berechnen der Ergebnismenge erfordert temporäre Tabellen, die schnell durch Ihre Speicherzuweisung essen werden, und wenn Sie jemals eine sortieren müssen, gibt es keinen möglichen Index dafür. Wenn die Tabellen unterschiedliche Schemas haben, werden die Spaltennamen aufgebockt.

In diesem Fall habe ich etwas versuchen würde:

SELECT * 
FROM contracts c 
    LEFT JOIN user_data u 
    ON c.type = 'user' AND c.user_id = u.id 
    LEFT JOIN team_data t 
    ON c.type = 'team' AND c.team_id = t.id 
WHERE c.contract_id = :contract_id 

Aber wackelig Anfragen wie diese sind in der Regel besser adressiert, indem Sie Ihre Datenbank-Schema neu zu bewerten.

Alternativ wählen Sie zuerst die Daten aus contracts aus und geben Sie dann eine separate Anweisung aus, um das Datum aus der Benutzer- oder Teamtabelle abzurufen.