Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 将两个表合并到单个查询结果中_Mysql_Sql - Fatal编程技术网

Mysql 将两个表合并到单个查询结果中

Mysql 将两个表合并到单个查询结果中,mysql,sql,Mysql,Sql,需要一些查询帮助。我在数据库中有两个表,联系人和任务 mysql> describe contacts; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+--

需要一些查询帮助。我在数据库中有两个表,联系人和任务

mysql> describe contacts;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| contact_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| last_name  | varchar(100) | YES  |     | NULL    |                |
| first_name | varchar(100) | YES  |     | NULL    |                |
| email      | varchar(50)  | YES  |     | NULL    |                |
| phone      | varchar(20)  | YES  |     | NULL    |                |
| school_id  | varchar(12)  | NO   |     | NULL    |                |
| access     | char(1)      | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

mysql> describe tasks;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| task_id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| task_name         | varchar(125) | YES  |     | NULL    |                |
| task_date         | date         | YES  |     | NULL    |                |
| task_description  | text         | YES  |     | NULL    |                |
| contact_id1       | int(11)      | YES  |     | NULL    |                |
| contact_id2       | int(11)      | YES  |     | NULL    |                |
| contact_id3       | int(11)      | YES  |     | NULL    |                |
| contact_id4       | int(11)      | YES  |     | NULL    |                |
| contact_id5       | int(11)      | YES  |     | NULL    |                |
| contact_id6       | int(11)      | YES  |     | NULL    |                |
| completed         | char(1)      | YES  |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+
我想从tasks表中获取信息,但我想用匹配的contact_id中的一些字段替换contact_id1-contact_id6。我一直在使用嵌套的select语句,这些语句可以工作,但非常混乱。看来必须有一个更干净的方法来做到这一点。我想我对这个有点兴趣

SELECT tasks.task_id, tasks.task_name, tasks.reminder_time, tasks.reminder_interval, CONCAT (contact_1.first_name, " ", contact_1.last_name) as contact_1_name, CONCAT(contact_2.first_name, contact_2.last_name) as contact_2_name, CONCAT(contact_3.first_name, contact_3.last_name) as contact_3_name
FROM tasks
JOIN contacts contact_1 ON tasks.contact_id1 = contact_1.contact_id
JOIN contacts contact_2 ON tasks.contact_id2 = contact_2.contact_id
JOIN contacts contact_3 ON tasks.contact_id3 = contact_3.contact_id
但我这里的问题是,它没有显示contact_id1-contact_id6的任何值为0的任务,如果没有为其设置contact_id,则该值为默认值


您所能提供的任何帮助都将是非常好的。

您可以创建一个视图来规范化任务表,这样连接就很容易了。您可以创建一个永久视图,也可以仅为选定对象创建一个永久视图

这种观点需要某种程度上是一种联盟

SELECT task_id, task_name, task_description, contact_id1 as contact_id, completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id2              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id3              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id4              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id5              , completed from tasks
UNION ALL
SELECT task_id, task_name, task_description, contact_id6              , completed from tasks
那么看起来是这样的

WITH tasks_easy as (    
    SELECT task_id, task_name, task_description, contact_id1 as contact_id, completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id2              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id3              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id4              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id5              , completed from tasks
    UNION
    SELECT task_id, task_name, task_description, contact_id6              , completed from tasks
 )
 select *
 from   tasks_easy t
 join   contacts c   on (t.contact_id = c.contact_id)
没有测试过这个,但是应该是这样工作的


编辑:事实上我正在考虑。联合所有,至少对于临时视图是不必要的。如果您的表格非常大,可能会给您带来一些时间上的改进。

请在继续之前研究一下标准化。
contacts
行是否存在
contact\u id=0
?如果没有,您希望它与您的加入条件一起返回什么?您的加入是否像这样
左加入联系人联系人联系人联系人1关于任务。联系人联系人联系人id 1=联系人联系人联系人1。联系人id和任务。联系人联系人id 1 0
这将保留左表(任务)上的所有记录,并在联系人id为0时加入联系人表,如果未找到contact_idX或为零,则contact_X中的所有值都将为空。这正是我要查找的。它比创建一堆嵌套的select语句然后加入它们更干净。非常欢迎您。在数据迁移项目中将数据从旧系统(历史上成长的或更好地说是历史上混乱的系统)转移到现代系统的过程中,有无数次是这样做的。有时候处理设计糟糕的表是不可避免的。我不得不承认这个数据库设计是我的。我更像是一个前端开发人员,通常访问某人创建的数据服务。在我第一次创建联系人表和任务表时,有没有关于如何更好地处理联系人表和任务表链接的提示?哈哈,对不起,当时我不想冒犯你。严格按照这本书,您将创建第三个表,其中包含任务的联系人,如
任务\u联系人
。然后你会有一个主键自动递增,你会有两个外键。一个外键是tasks表的task_id,一个外键是contacts表的contact_id。使它更复杂,但正如您在查询中看到的,它可能会有所帮助。啊,我明白了。这种布局也会打开它,这样我就不会被限制在最初设置的每个任务只有6个联系人。下次我需要花更多的时间规划数据库结构。非常感谢所有有用的信息。