表1上的所有条目,但仅匹配表2上的全部,其中表2包含where语句

时间:2018-10-14 04:57:19

标签: mysql join where

我在合并下表时遇到问题,因为表1包含所有专家,即

约翰(id1)
皮特(ID2)
哈里(id3)
乔安妮(id4)
等等

仅当专家在某一天有空时(即

)填充表2

id1 2018-10-19
id3 2018-10-19

当我使用where语句table2.date = 2018-10-19是时,我需要MySQL查询的结果

约翰2018-10-19
皮特
哈里2018-10-19
乔安妮

但是我真正得到的是

约翰2018-10-19
哈里2018-10-19

这是正确的,但我需要所有专家按顺序显示。

任何人都可以提供任何建议

1 个答案:

答案 0 :(得分:0)

除非您的问题不是一个好问题(并且我怀疑这可能是一个不好的问题),否则您不需要where语句。所以

drop table if exists t1,t2;

create table t1 (id int,val varchar(10));
insert into t1 values
(1,'John' ),
(2,'Pete' ),
(3,'Harry'),
(4,'Joanne');

create table t2(t1id int,dt date);
insert into t2 values
(1 ,'2018-10-19'),
(3 ,'2018-10-19');

 SELECT * from t1
 LEFT OUTER JOIN t2 ON t1.id = t2.t1id
 order by t1.val;

结果

+------+--------+------+------------+
| id   | val    | t1id | dt         |
+------+--------+------+------------+
|    3 | Harry  |    3 | 2018-10-19 |
|    4 | Joanne | NULL | NULL       |
|    1 | John   |    1 | 2018-10-19 |
|    2 | Pete   | NULL | NULL       |
+------+--------+------+------------+
4 rows in set (0.00 sec)

如果您要按名称值订购,我不知道如何在结果集中获得约翰斯,皮特,哈里,琼安。 而且'“&request.querystring(” d“)&”'不是mysql这是什么php?

如果您对可用性或在特定日期内感兴趣,例如,您将首先交叉参加(创建笛卡尔产品)专家,例如到目前为止

select t1.id,t1.val,dt
 from t1
 cross join (select '2018-10-19' dt 
 #union all select '2018-10-20'
 ) s;
+------+--------+------------+
| id   | val    | dt         |
+------+--------+------------+
|    1 | John   | 2018-10-19 |
|    2 | Pete   | 2018-10-19 |
|    3 | Harry  | 2018-10-19 |
|    4 | Joanne | 2018-10-19 |
+------+--------+------------+
4 rows in set (0.00 sec)

然后查看它们是否存在于表2

select t.id,t.val,t.dt tdt , ifnull(t2.dt,'Not Available') t2dt
 from 
 (select t1.id,t1.val,dt
 from t1
 cross join (select '2018-10-19' dt 
 #union all select '2018-10-20'
 ) s
 ) t 
 left join t2
 on t.id = t2.t1id and t2.dt = t.dt
 order by t.dt,val;

+------+--------+------------+---------------+
| id   | val    | tdt        | t2dt          |
+------+--------+------------+---------------+
|    3 | Harry  | 2018-10-19 | 2018-10-19    |
|    4 | Joanne | 2018-10-19 | Not Available |
|    1 | John   | 2018-10-19 | 2018-10-19    |
|    2 | Pete   | 2018-10-19 | Not Available |
+------+--------+------------+---------------+

请注意,通过使用并集,交叉连接中可以包含任意数量的日期。我有2018-10-20的评论。

如果日期范围较大,则联合可能变得笨拙,并且在数据库中创建日历/日期表可能很有用,您可以将其替换为交叉联接。例如

select t.id,t.val,t.dt tdt , ifnull(t2.dt,'Not Available') t2dt
 from 
 (select t1.id,t1.val,dt
 from t1
 cross join (select dte dt from dates where dte between '2018-10-19' and '2018-10-19' 
 ) s
 ) t 
 left join t2
 on t.id = t2.t1id and t2.dt = t.dt
 order by t.dt,val;

您当然可以在需要的条件下修改交叉联接。