我在合并下表时遇到问题,因为表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
这是正确的,但我需要所有专家按顺序显示。
任何人都可以提供任何建议
答案 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;
您当然可以在需要的条件下修改交叉联接。