Все записи в таблице 1, но только соответствующие, входят в таблицу 2, где таблица 2 содержит оператор where - PullRequest
0 голосов
/ 14 октября 2018

У меня проблема с присоединением к следующим таблицам, поскольку в таблице 1 содержатся все специалисты, т. Е.

Джон (id1)Пит (id2)Гарри (id3)Джоан (id4) и т. Д.

Таблица 2 заполняется только в том случае, если специалист имеет доступность в определенный день, т. Е.

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

Результаты, которые мне нужны из запроса MySQL при использовании оператора where table2.date = 2018-10-19, равны

John 2018-10-19ПитГарри 2018-10-19Joanne

но на самом деле я получаю

Джон 2018-10-19Гарри 2018-10-19

это правильно, но мне нужно, чтобы все специалисты показывали по порядку.

Может ли кто-нибудь помочь с любыми предложениями, пожалуйста

1 Ответ

0 голосов
/ 14 октября 2018

Если ваш вопрос не является хорошим (и я подозреваю, что он может быть плохим), вам не нужно утверждение 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;

Конечно, вы можете изменить условие перекрестного соединения в любом месте.

...