2016-05-25 4 views
1

contractsという名前のテーブルからデータを取得するクエリを作成していて、テーブルuser_dataまたはteamsに結合しています。テーブルcontractsには、contracteeTypeという名前の列があります。ここでは、引数の条件変数として使用します。 PHPコードの用語では、これは以下のように行われます:MySQL - ケース/ Ifステートメント

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

私はこれを研究して試してみましたが、私は問題のCASE文のソリューションに出くわしたが、それは私のサーバー上で作業していないと思われます。以下は、私が思い付くていたものです:

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 

私は私のクエリを使用してこのタスクを実行し、別の値に応じて、テーブルからデータを取得できますか?

+0

mysqlエラーログを確認しましたか?構文に誤りがあります。 –

+3

この種の問題は、設計が不良であることを示す可能性があります。 – Strawberry

+1

いいえ、条件付きテーブル選択はクエリでできません。これ以上必要な場合は、動的テーブル名を使用してprepareステートメントを使用してストアドプロシージャを使用する必要があります。 –

答えて

1

"if"が表示される唯一の方法は、ストアドプロシージャを使用することです。あなたの質問はちょっと混乱していますが、ストアドプロシージャを作成して呼び出すことで解決できると確信しています。

このアプローチにはいくつかの欠点があります(コードがたくさんあり、単純なクエリとは異なります)。多くのポイントがあります(事前にコンパイルされたように安全で高速で、 "PHP"タイプのロジックでは無限に柔軟です)。

これは、ストアドプロシージャの例です...

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

組合が少量でのみ良好です。結果セットを計算するには、一時的なテーブルが必要です。このテーブルはメモリ割り当てによって素早く食べられます。ソートする必要がある場合は、それを行うインデックスがありません。また、テーブルに異なるスキーマがある場合は、列名がジャックアップされます。私のようなものを試してみた。この場合

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 

しかし、このようなグラグラクエリは通常、より良いあなたのデータベーススキーマを再評価することによって対処されています。

また、最初にcontractsのデータを選択し、別のステートメントを発行してユーザーまたはチームテーブルから日付を取得してください。