2016-11-06 55 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   | 
+---------+----------------+------------+-----------+ 

使用PDO我得到了整個數據我在使用INNER JOIN與來自不同表中的數據(和$ _ 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 

上面的查詢返回想:

+---------+--------------+--------------+----------------+------------+-----------+------------------+------------------------+------------+-------------+-----------------+-----------+----------------+--------------------+---------------------+-----------+---------------------+------------------+---------------------+ 
| 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 | 
+---------+--------------+--------------+----------------+------------+-----------+------------------+------------------------+------------+-------------+-----------------+-----------+----------------+--------------------+---------------------+-----------+---------------------+------------------+---------------------+ 

而且我想獲得在task_creator,task_author和task_graphic之後添加了user_nice_name的查詢 - 從表中選擇的明顯不錯的名字用戶根據ID在以上3個字段中提供的內容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) | 
+---------+--------------+------------------------------------+--------------+--------------------------------------+ 

我該如何做到這一點?

+0

爲包含task_graphic名稱的表添加聯接 – scaisEdge

+0

INNER JOIN用戶ON users.user_nice_name = tasks.task_graphic'? – 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的引用。
  • 對於users,如果缺少一些參考值,則使用LEFT JOIN
  • 你需要處理你的命名。 「倉庫」ID與「任務」ID匹配沒有意義。或者,「任務」ID匹配「類型」ID。但這就是你在你的問題中如何表達查詢。
  • ORDER BY實際上什麼都不做,因爲所有的行都有相同的task_id
+0

謝謝!奇蹟般有效 :) – knysha

0

假設task_graphic_name是表名內task_graphic_table和關係場均task_graphic_id

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 

如果你需要列出現在一個特定的順序,你應該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

在查詢中添加兩個子查詢。像

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 
.... 
....