2013-03-12 5 views
0

Следуйте за моим question, где я использовал ответ для генерации данных в моем календаре, который называется календарем обслуживания, отображающим график обслуживания воздушного судна. Это запрос MySQL для него:MySQL внутреннее соединение трех таблиц для использования в календаре

SELECT DISTINCT s.reg AS 'reg', 
       a.date AS 'date' 
FROM (SELECT Curdate() 
       + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) day AS Date 
     FROM (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
       UNION ALL SELECT 4 
       UNION ALL SELECT 5 
       UNION ALL SELECT 6 
       UNION ALL SELECT 7 
       UNION ALL SELECT 8 
       UNION ALL SELECT 9) AS a 
       CROSS JOIN (SELECT 0 AS a 
          UNION ALL SELECT 1 
          UNION ALL SELECT 2 
          UNION ALL SELECT 3 
          UNION ALL SELECT 4 
          UNION ALL SELECT 5 
          UNION ALL SELECT 6 
          UNION ALL SELECT 7 
          UNION ALL SELECT 8 
          UNION ALL SELECT 9) AS b 
       CROSS JOIN (SELECT 0 AS a 
          UNION ALL SELECT 1 
          UNION ALL SELECT 2 
          UNION ALL SELECT 3 
          UNION ALL SELECT 4 
          UNION ALL SELECT 5 
          UNION ALL SELECT 6 
          UNION ALL SELECT 7 
          UNION ALL SELECT 8 
          UNION ALL SELECT 9) AS c) a 
     INNER JOIN maintenance_sched s 
       ON a.date >= s.date_from 
        AND a.date <= s.date_to 
WHERE Month(date) = '".$month."' 
     AND Dayofmonth(date) = '".$dayArray["mday"]."' 
     AND Year(date) = '".$year."' 

Вот maintenance_sched база данных:

maintenance_sched table

И календарь выглядит следующим образом (на основе данных из maintenance_sched):

enter image description here

Затем у меня есть другой календарь, называемый календарем резервирования с тем же кодом, что и основной но с другим запросом. Это запрос календаря бронирования: SELECT acode FROM reservation WHERE month(etd) = '".$month."' AND dayofmonth(etd) = '".$dayArray["mday"]."' AND year(etd) = '".$year."' ORDER BY etd".

В таблице заказ это:

enter image description here

И календарь бронирования выглядит следующим образом:

enter image description here

EDIT:

То, что я хочу сделать, это : есть два этих календаря: один календарь с результатом запроса maintenance_sched, выводимого как строка с strikethrough. Но я не могу заставить эти два вопроса работать вместе.

+1

Nice изображений, но любой шанс, что вы можете оставить соответствующий SQL вместо всего этого кода? – Popnoodles

+0

Я замечаю, что вы выполняете mysql_query внутри цикла for. Во-первых, вы не должны использовать mysql_query, поскольку он скоро будет устаревшим, вместо этого используйте mysqli или pdo. Во-вторых, вы обычно должны запрашивать один раз, а затем повторяете свои результаты несколько раз со стороны приложения. На первый взгляд то, что вы написали, кажется крайне неэффективным. –

+0

SQL находятся в коде. Я опубликовал все эти коды для лучшего понимания того, что я пытаюсь сделать. – xjshiya

ответ

0

Я действительно думаю, что ответ на этот вопрос состоит в том, чтобы просто присоединиться к двум запросам. Примером этого может быть, например, ниже, где вы просто исключаете любые столбцы, которые не входят в вашу вторую таблицу.

SELECT id, date, field3, description 
FROM table1 
UNION 
SELECT id, date, field3, null 
FROM table2 
0

Поскольку не существует никакой связи между как за столом, мы не можем пойти на соединения, было бы лучше пойти на UNION объединить результат.

Этот запрос использует GROUP_CONCAT так будет генерировать общие результаты в следующем виде

2013-03-15 | RP-C1728, RP-C1086 

2013-03-08 | RP-C1728, RP-C1086, RP-C143 

Если вы не хотите запись в этом формате, то просто удалить group_concat, группу по статье из запроса.

Запрос

SELECT a.date, group_concat(a.reg) 
FROM 
    (SELECT DISTINCT s.reg AS 'reg', 
       a.date AS 'date' 
     FROM (SELECT Curdate() 
       + INTERVAL (a.a + (10 * b.a) + (100 * c.a)) day AS Date 
      FROM (SELECT 0 AS a 
       UNION ALL SELECT 1 
       UNION ALL SELECT 2 
       UNION ALL SELECT 3 
       UNION ALL SELECT 4 
       UNION ALL SELECT 5 
       UNION ALL SELECT 6 
       UNION ALL SELECT 7 
       UNION ALL SELECT 8 
       UNION ALL SELECT 9) AS a 
       CROSS JOIN (SELECT 0 AS a 
          UNION ALL SELECT 1 
          UNION ALL SELECT 2 
          UNION ALL SELECT 3 
          UNION ALL SELECT 4 
          UNION ALL SELECT 5 
          UNION ALL SELECT 6 
          UNION ALL SELECT 7 
          UNION ALL SELECT 8 
          UNION ALL SELECT 9) AS b 
       CROSS JOIN (SELECT 0 AS a 
          UNION ALL SELECT 1 
          UNION ALL SELECT 2 
          UNION ALL SELECT 3 
          UNION ALL SELECT 4 
          UNION ALL SELECT 5 
          UNION ALL SELECT 6 
          UNION ALL SELECT 7 
          UNION ALL SELECT 8 
          UNION ALL SELECT 9) AS c) a 
     INNER JOIN maintenance_sched s 
       ON a.date >= s.date_from 
        AND a.date <= s.date_to 
WHERE Month(date) = '".$month."' 
     AND Dayofmonth(date) = '".$dayArray["mday"]."' 
     AND Year(date) = '".$year."' 
UNION ALL 
SELECT acode as 'reg', date as 'date' //Add the date logic here as per your need 
FROM reservation 
WHERE month(etd) = '".$month."' AND 
dayofmonth(etd) = '".$dayArray["mday"]."' AND 
year(etd) = '".$year."' ORDER BY etd) a 
GROUP BY a.date; 

Примечания Для второго запроса добавить согласовывая дату логике

Смежные вопросы