2016-11-14 8 views
0

私は2種類のユーザーのデータベースを持っていますが、ユーザーはindividualまたはorganizationのいずれかの親ユーザーuserの子である可能性があります。 individualは、両方のユーザーのすべての属性を定義でき、空のフィールドを持つ単一のテーブルを持つのと異なり、userテーブルを作成することにしました。このテーブルには2つのタイプのユーザー間に共通の属性があります。ユーザのタイプを保持しているので、そのユーザが個人である場合、私はindividualテーブルを参照しなければならず、その逆の場合はindividualテーブルとorganizationテーブルはuser foreign keyここで特定され、私は一つのテーブルをしなかった理由を、私のデータベーステーブル enter image description hereCASEを使用したSQLクエリの問題

のグラフィカルな表現を包みなさいあなたが思っていると、私はアプリの成長に合わせて、ユーザーと組織テーブルの両方に多くの属性を追加することを計画する余地を残しています私は自分のIDを持っていますが、userTypeをチェックして、次の属性セットの正しいテーブルを指し示すにはどうすればいいですか? IDは2で、個々のテーブルにはどのように名詞を付けられますか?

クエリの私の考えはのようなものです:

Select users.email, users.profilePhoto, users.userSince, CASE WHEN userType = 1 THEN SELECT individual.fname, individual.lname WHERE users.id = 1 AND individual.userFK = 1 END FROM users 

しかし、私は常にエラーが出るようCASE声明に精通していないです、助けたいだれでも、あなたが最も歓迎されています。

+0

https://dev.mysql.com/doc/refman/5.7/en/case.html – coder

+0

@coder私はあなたのリンク、その教育に見えたが、今、私は必要なものを1つが、クエリでいます助けて、そこから私が間違っているところを学ぶ –

+2

あなたはそれを行うために 'Case'を必要としません、[' LEFT JOIN'](http://www.mysqltutorial.org/mysql-left-join。 aspx)。 –

答えて

1

をやってしまったあなたはSELECT部分にデータセットを構築しようとしているが、SELECT部分は出力だけではなく、データセットを構築するための入力ではなくを変更するためです。

データセットは、JOINのクロスセレクションと組み合わせてWHEREステートメントを使用してビルドされています。

集計はGROUP BYを使用して行うことができますが、これまでにこれを行う必要はありません。

SELECT 
      u.*, 
      i.*, 
      o.* 
    FROM users u 
LEFT JOIN individual i 
     ON i.userFK = u.userFK 
LEFT JOIN organization o 
     ON o.userFK = u.userFK 
0

私はこの

$userFk = $_POST['userFk']; 
$stmt = $conn->prepare("SELECT profilePhoto, userType FROM users WHERE id = ?"); 
$stmt->bind_param("s", $userFk); 
if($stmt->execute()) 
{ 
$user = $stmt->get_result()->fetch_assoc(); 
$userType = $user['userType']; 
if($userType == 1) 
{ 
    $stmt = $conn->prepare("SELECT fname, lname From individual WHERE userFk = ?"); 
    $stmt->bind_param("s", $userFk); 
    if($stmt->execute()) 
    { 
     $details = $stmt->get_result()->fetch_assoc(); 
     $user['fname'] = $details['fname']; 
     $user['lname'] = $details['lname']; 
    } 
}else if($userType == 3) 
{ 
    $stmt = $conn->prepare("SELECT name From organization WHERE userFk = ?"); 
    $stmt->bind_param("s", $userFk); 
    if($stmt->execute()) 
    { 
     $details = $stmt->get_result()->fetch_assoc(); 
     $user['organizationName'] = $details['name']; 

    } 
} 
} 
+0

不必要なオーバーヘッドを追加して問題を回避すると、学習曲線はフラットな線になります。 – DanFromGermany

+0

@DanFromGermanyよく人々が助けたいと思わないなら私は何もできません、私はこれがすべて私が考えることができることを意味することを意味します –

+0

人々はコメントに助けを与えました。 'CASE'を使わず、2つのLEFT JOINS、' ON users.userFK = individual.userFK'を使い、組織テーブルと同じです。 – DanFromGermany