2016-11-06 5 views
1

私はmysql結合に苦労しています:/MySQL - 内部結合 - 他の値に基づく値を持つ列を追加する

私はデータベースfeの中に複数のテーブルを持っています。 タスクユーザーなど

タスク様々な変数を持つタスクを含むが、最も重要な - のIDのユーザーのは、(別のタスク内の役割として - 著者、グラフィック、補正)タスクに署名した。

+---------+-------------+--------------+ 
| task_id | task_author | task_graphic | 
+---------+-------------+--------------+ 
| 444  | 1   | 2   | 
+---------+-------------+--------------+ 

ユーザ使用

+---------+----------------+------------+-----------+ 
| user_id | user_nice_name | user_login | user_role | 
+---------+----------------+------------+-----------+ 
| 1  | Nice Name #1 | login1  | 0   | 
+---------+----------------+------------+-----------+ 
| 2  | Bad Name #2 | login2  | 1   | 
+---------+----------------+------------+-----------+ 

+---------+--------------+--------------+----------------+------------+-----------+------------------+------------------------+------------+-------------+-----------------+-----------+----------------+--------------------+---------------------+-----------+---------------------+------------------+---------------------+ 
| task_id | task_creator | task_graphic | task_purchaser | task_title | task_lang | task_description | task_description_files | task_files | task_status | task_prod_index | task_type | task_print_run | task_print_company | task_warehouse_code | task_cost | task_time_added  | task_deadline | task_date_warehouse | 
+---------+--------------+--------------+----------------+------------+-----------+------------------+------------------------+------------+-------------+-----------------+-----------+----------------+--------------------+---------------------+-----------+---------------------+------------------+---------------------+ 
| 2  | 1   | 2   | 1    | Test  | PL  | Lorem ipsum (?) |      |   | w   | 2222   | 3   | 456546   | Firma XYZ   | 2     | 124  | 29.09.2016 15:48:20 | 01.10.2016 12:00 | 07.10.2016 14:00 | 
+---------+--------------+--------------+----------------+------------+-----------+------------------+------------------------+------------+-------------+-----------------+-----------+----------------+--------------------+---------------------+-----------+---------------------+------------------+---------------------+ 

そして、私は取得したいのですが:PDOは、私はINNERが異なるテーブルからのデータ(および$ _GET変数)、クエリ上記

SELECT tasks.*, types.types_name, warehouse.warehouse_id, warehouse.warehouse_code, warehouse.warehouse_description 
FROM tasks 
INNER JOIN types ON types.types_id = tasks.task_id 
INNER JOIN warehouse ON warehouse.warehouse_id = tasks.task_id 
WHERE tasks.task_id = '".$get_id."' 
ORDER BY tasks.task_id 

を返すとJOINを使用している間、私がしたい全体のデータを取得していますtask_creator、task_author、task_graphicの後にuser_nice_nameが追加されたクエリ - テーブルから選択された素敵な名前上記の3つのフィールドにあるIDに基づいてfe。

+---------+--------------+------------------------------------+--------------+--------------------------------------+ 
| task_id | task_creator | task_creator_nn     | task_graphic | task_graphic       | 
+---------+--------------+------------------------------------+--------------+--------------------------------------+ 
| 2  | 1   | Nice Name (from task_creator ID=1) | 2   | Nice Name (from task_graphic ID = 2) | 
+---------+--------------+------------------------------------+--------------+--------------------------------------+ 

どうすれば実現できますか?あなたは3が必要

+0

INNERはusers.user_nice_name = tasks.task_graphic'上のユーザーを登録しよう? 'task_graphic名 – scaisEdge

+0

が含まれているテーブルに対して参加を追加 – knysha

答えて

0

は加入:

SELECT t.*, 
     uc.user_nice_name as creator_name, 
     ug.user_nice_name as graphic_name, 
     up.user_nice_name as purchaser_name, 
     ty.types_name, w.warehouse_id, w.warehouse_code, w.warehouse_description 
FROM tasks t INNER JOIN 
    types ty 
    ON ty.types_id = t.task_id INNER JOIN 
    warehouse w 
    ON w.warehouse_id = t.task_id LEFT JOIN 
    users uc 
    ON uc.user_id = t.task_creator LEFT JOIN 
    users ug 
    ON ug.user_id = t.task_graphic LEFT JOIN 
    users up 
    ON up.user_id = t.task_purchaser 
WHERE t.task_id = '".$get_id."' 
ORDER BY t.task_id; 

注:

  • 表の別名を書くことや読むことをクエリが容易になります。 FROM句にusersという3つの参照があるため、これらも必要です。
  • 参照値の一部が欠落している場合は、usersLEFT JOINを使用します。
  • あなたの命名に取り組む必要があります。 「倉庫」IDが「タスク」IDと一致することは意味をなさない。または、「タスク」IDが「タイプ」IDと一致すること。しかし、それはあなたの質問の中でどのように表現したのですか?
  • ORDER BYは、すべての行が同じtask_idを持つため、効果的に何もしません。あなたが列を必要とする場合task_graphic_nameは、テーブル名内task_graphic_tableと関係の分野であると仮定すると
+0

ありがとうございました!魅力的な作品:) – knysha

0

SELECT tasks.* 
     , types.types_name 
     , warehouse.warehouse_id 
     , warehouse.warehouse_code 
     , warehouse.warehouse_description 
     , users.user_nice_name 
FROM tasks 
INNER JOIN types ON types.types_id = tasks.task_id 
INNER JOIN warehouse ON warehouse.warehouse_id = tasks.task_id 
INNER JOIN users ON users.user_nice_name = tasks.task_graphic 
WHERE tasks.task_id = '".$get_id."' 
ORDER BY tasks.task_id 

task_graphic_idしていて、explicitallyシーケンスなどに列名を呼び出す必要があり、特定の順序で表示されます:

SELECT tasks.col1 
     , task.col2 
     , types.types_name 
     , warehouse.warehouse_id 
     , warehouse.warehouse_code 
     , task.col2 
     , warehouse.warehouse_description 
     , task_graphic_table.task_graphic_name 
0

クエリで2つのサブクエリを追加します。以下のような

SELECT tasks.*, 
.... 
...., 
(select user_nice_name from users where id = tasks.task_author) AS task_creator_name, 
(select user_nice_name from users where id = tasks.task_graphic) AS task_graphic_name 
FROM tasks 
INNER JOIN types ON types.types_id = tasks.task_id 
.... 
.... 
関連する問題