MySQL - 内部联接 - 根据其他值

时间:2016-11-06 12:25:05

标签: php mysql pdo inner-join

我正在努力使用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) |
+---------+--------------+------------------------------------+--------------+--------------------------------------+

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:0)

您需要三个联接:

switch

注意:

  • 表别名使查询更易于编写和读取。它们也是必需的,因为在template<typename T> void Set<T>::doubleRotateRight(Elem *& node) { static auto const privmed = []() -> void { //out << "who" << endl; }; // you fill in here rotateRight(node->left); rotateLeft(node); //call private helper not defined in header privmed(); } 子句中有三个对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; 的引用。
  • 如果缺少部分参考值,则会users使用FROM
  • 您需要处理您的命名。一个&#34;仓库&#34;没有意义。 id匹配&#34;任务&#34; ID。或者那个&#34;任务&#34; id匹配&#34;类型&#34; ID。但这就是你在问题中如何处理查询。
  • LEFT JOIN实际上无效,因为所有行都具有相同的users

答案 1 :(得分: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

如果您需要以特定顺序显示列,则应明确地按顺序调用列名称,例如:

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

答案 2 :(得分: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
....
....