2017-09-29 8 views
0

私はテーブル「apple」と「orange」を持っていると言いますが、「num」を提供するこれらのテーブルを内部で結合し、すべての4の代償としてタスク名を受け取ることができるようにしたいとします。仕事。複数の値を受け取る内部結合

しかし、内部結合は1つのタスクに対してのみ機能し、4つすべてでは機能しないようです。

SELECT orange.name 
FROM apple 
    INNER JOIN orange ON orange.task_id = apple.Task1 
WHERE num = ? 

これは、タスク1の名前を提供します与えられた私が言うNUM =私はNUM = 1を言う与え1.

タスク1、タスク2、タスク3、Task4の名前を受信する方法はあり、?それとも4つの別々のリクエストが必要ですか?

Here are the tables

+0

Ryanこの記事をお読みくださいhttp://www.mysqltutorial.org/mysql-inner-join.aspx回答が得られることを願って –

+0

このスキーマは[ゼロ、1または無限大ルール](http ://en.wikipedia.org/wiki/Zero_one_infinity_rule)は [データベースの正規化](http://en.wikipedia.org/wiki/Database_normalization)です。適切なリレーショナル形式になるように構造化すれば、これははるかに簡単です。 – tadman

答えて

2

あなたは上記のクエリは、それがapple.Task1でだと仮定すると、少なくとも1つのタスクを持つ行のみを返しますコード

select orange.name from 
    (select Task1 as task from apple t1 
    union 
    select Task2 as task from apple t1 
    union 
    select Task3 as task from apple t1 
    union 
    select Task4 as from apple t1 
    ) T inner join orange on orange.task_id=T.task 
1
SELECT apple.num 
    , o1.name AS task1 
    , o2.name AS task2 
    , o3.name AS task3 
    , o4.name AS task4 
FROM apple 
INNER JOIN orange o1 ON o1.task_id = apple.Task1 
LEFT OUTER JOIN orange o2 ON o2.task_id = apple.Task2 
LEFT OUTER orange o3 ON o3.task_id = apple.Task3 
LEFT OUTER orange o4 ON o4.task_id = apple.Task4 
WHERE apple.num = ? 

下回ることによって試すことができます。 4つのタスクが常に保証されている場合は、JOINごとにINNER JOINを使用して結果を絞り込むことができます。そうしないと、LEFT OUTER JOINNULLタスクを持つ行を排除しません。

関連する問題