Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL从3个表中选择并合并列名_Mysql_Sql - Fatal编程技术网

Mysql SQL从3个表中选择并合并列名

Mysql SQL从3个表中选择并合并列名,mysql,sql,Mysql,Sql,我试图从MySQL中的3个表中获取数据,并更改/合并它们的列名。现在,当我使用将列名设置为时,它们是重复的 人员表格: id applicant_id employee_id --------------------------------- 1 3 6 2 4 10 3 12 30 id applicant_

我试图从MySQL中的3个表中获取数据,并更改/合并它们的列名。现在,当我使用
将列名设置为
时,它们是重复的

人员表格:

id    applicant_id    employee_id
---------------------------------
1     3               6          
2     4               10         
3     12              30            
id    applicant_id    applicant_note    applicant_note_date
-----------------------------------------------------------
1     3               "Was good"        2013-05-01
1     4               "Was so-so"       2013-06-07
2     4               "Was bad"         2013-06-08
3     4               "Was great"       2013-06-10
id    employee_id    employee_note    employee_note_date
--------------------------------------------------------
1     10              "Was ok"        2013-07-20
1     10              "Was great"     2013-07-21
2     30              "Was bad"       2013-08-01
3     30              "Was so-so"     2013-08-02
申请人表格:

id    applicant_id    employee_id
---------------------------------
1     3               6          
2     4               10         
3     12              30            
id    applicant_id    applicant_note    applicant_note_date
-----------------------------------------------------------
1     3               "Was good"        2013-05-01
1     4               "Was so-so"       2013-06-07
2     4               "Was bad"         2013-06-08
3     4               "Was great"       2013-06-10
id    employee_id    employee_note    employee_note_date
--------------------------------------------------------
1     10              "Was ok"        2013-07-20
1     10              "Was great"     2013-07-21
2     30              "Was bad"       2013-08-01
3     30              "Was so-so"     2013-08-02
员工表格:

id    applicant_id    employee_id
---------------------------------
1     3               6          
2     4               10         
3     12              30            
id    applicant_id    applicant_note    applicant_note_date
-----------------------------------------------------------
1     3               "Was good"        2013-05-01
1     4               "Was so-so"       2013-06-07
2     4               "Was bad"         2013-06-08
3     4               "Was great"       2013-06-10
id    employee_id    employee_note    employee_note_date
--------------------------------------------------------
1     10              "Was ok"        2013-07-20
1     10              "Was great"     2013-07-21
2     30              "Was bad"       2013-08-01
3     30              "Was so-so"     2013-08-02
我只有
员工id
。我想确保我从员工和申请人那里得到了所有的笔记,我想让他们合并到同一列中,而不是有重复的
NULL
值的列。我想返回如下结果:

note            date          type
------------------------------------------------
"Was so-so"     2013-06-07    applicant
"Was bad"       2013-06-08    applicant
"Was great"     2013-06-10    applicant
"Was ok"        2013-07-20    employee
"Was great"     2013-07-21    employee
我现在的处境是:

SELECT
    applicants.applicant_note AS note,
    applicants.applicant_note_date AS date,
    employees.employee_note AS note,
    employees.employee_note_date AS date
    IF(applicants.applicant_id IS NULL, 'employee', 'applicant') as type
FROM
    employees
JOIN
    people
ON
    people.employee_id = employees.employee_id
JOIN
    applicants
ON
    applicants.applicant_id = people.applicant_id
WHERE
    employees.employee_id = 10    

有没有一种方法可以仅使用SQL来实现这一点?或者我需要运行单独的查询来获取申请人id和员工id吗?

您需要使用
UNION ALL

SELECT  employee_note note,
        employee_note_date date,
        'employee' type
FROM    people a
        INNER JOIN employees b
            ON a.employee_ID = b.employee_ID
WHERE   a.employee_ID = 10
UNION ALL
SELECT  applicant_note note,
        applicant_note_date date,
        'applicant' type
FROM    people a
        INNER JOIN applicants b
            ON a.applicant_id = b.applicant_id
WHERE   a.employee_ID = 10

最简单的方法是复制您要求的内容,即使用UNION。对于该零件,可以使用employees表中的employees_id=10。对于申请人,您可以使用子查询,其中申请人id是从员工id=10的人员表中提取的

  SELECT  employee_note note, 
      employee_note_date date, 
      'employee' type
  FROM    employees e  
  WHERE   e.employee_id = 10
  UNION  
  SELECT applicant_note note,    
      applicant_note_date date,  
      'applicant' type
  FROM    applicants a
  WHERE   applicant_id = (SELECT applicant_id FROM people WHERE employee_id = 10)
使用JOIN的一个优点是,查询可以转换为一个派生表,允许在查询末尾的单个位置指示员工id(或者通过申请人id或people.id限制列表,只需稍加修改)。此外,该表还可以包含people.id,以确保在查询中显示正确的人。例如:

  SELECT * FROM (
      SELECT  p.id person,
          employee_note note,
          employee_note_date date,
          'employee' type
      FROM    employees e
      JOIN people p on p.employee_id = e.employee_id
      UNION 
      SELECT  p.id person,
          applicant_note note,
          applicant_note_date date,
          'applicant' type
      FROM    applicants a
      JOIN people p on p.applicant_id = a.applicant_id
  ) q
  WHERE q.person in(SELECT id FROM people WHERE employee_id = 10)
下面是创建这三个表的语句

CREATE TABLE `people` (`id` int(11) NOT NULL, `applicant_id` int(11) NOT NULL, 
  `employee_id` int(11) NOT NULL, PRIMARY KEY (`id`),
  KEY `applicant_id_index` (`applicant_id`),
  KEY `employee_id_index` (`employee_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `employees` (`employees_id` int(11) NOT NULL AUTO_INCREMENT,
 `id` int(11) NOT NULL, `employee_id` int(11) NOT NULL,
  `employee_note` varchar(12) DEFAULT NULL,
  `employee_note_date` datetime DEFAULT NULL,
  PRIMARY KEY (`employees_id`),
  KEY `employee_id_index` (`employee_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `applicants` (
  `applicants_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `applicant_id` int(11) NOT NULL,
  `applicant_note` varchar(12) DEFAULT NULL,
  `applicant_note_date` datetime DEFAULT NULL,
  PRIMARY KEY (`applicants_id`),
  KEY `applicant_id_index` (`applicant_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `employees` VALUES (1,1,10,'Was ok','2013-07-20 00:00:00'),  
 (2,1,10,'Was great','2013-07-21 00:00:00'),(3,2,30,'Was bad','2013-08-01 00:00:00'),  
 (4,3,30,'Was so-so','2013-08-02 00:00:00');
INSERT INTO `people` VALUES (1,3,6),(2,4,10),(3,12,30);
INSERT INTO `applicants` VALUES (1,1,3,'Was good','2013-05-01 00:00:00'),  
 (2,1,4,'Was so-so','2013-06-07 00:00:00'),
 (3,2,4,'Was bad','2013-06-08 00:00:00'),
 (4,3,4,'Was great','2013-06-10 00:00:00');

杰出的但是,在第一次选择时,您是否可以跳过
内部联接
,根据notes表中的员工id执行
WHERE
?我试过了,它似乎工作得很好,只是好奇地听到你使用
内部连接的理由