2014-05-06 30 views
0

我現在的表是這樣的:MySQL的內部連接ON子句現場未找到

Lessons: 
+-----------------------------------+ 
| ID | Name | StartDate | Repeats | 
|----|-------|------------|---------| 
| 1 | Maths | 2014-05-05 | 5 | 
| 2 | Lunch | 2014-05-05 | 1 | 
| 3 | Comp | 2014-05-05 | 7 | 
+-----------------------------------+ 

LessonTimes: 
+-------------------------------------+ 
| ID | LessonID | StartTime | EndTime | 
|----|----------|-----------|---------| 
| 1 | 1  | 10:00:00 | 5 | 
| 2 | 2  | 12:25:00 | 1 | 
| 3 | 3  | 14:00:00 | 7 | 
+-------------------------------------+ 

Tally: 
+----+ 
| ID | 
|----| 
| 1 | 
| 2 | 
| . | 
| . | 
+----+ 

我有一個具體的開始日期一定天數,即重複事件。目前的查詢我擁有的是:

SELECT E.ID 
    , E.Name 
    , E.StartDate 
    , E.Repeats 
    , A.ShowDate 
    , DATEDIFF(E.StartDate, A.ShowDate) diff 
    , T.StartTime 
    , DATE_ADD(A.ShowDate, INTERVAL T.StartTime HOUR_SECOND) ShowTime 
    FROM Planner_Lessons E 
    , (SELECT DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY) ShowDate 
      FROM `Planner_Tally` 
      WHERE (DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY)<= '2014-05-30 00:00:00') 
      ORDER 
      BY Id ASC 
     ) A 
    LEFT 
    JOIN Planner_LessonTimes T 
     ON T.LessonID = E.ID 
    WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats) = 0 
    AND A.ShowDate >= E.StartDate 

但我得到的錯誤是說,現場E.ID不能在「ON」的條款中找到。

原來的問題,我發現查詢的是在這裏 - PHP/MySQL: Model repeating events in a database but query for date ranges

+1

我想你左'加'與'A'表,所以你不能設置條件'T.LessonID = E.ID' – Sathish

+0

Planner_lessons和A沒有on子句或內/外連接語法 – xQbert

+0

不要混合隱式(逗號 - )和顯式連接語法。實際上,根本不要使用隱式連接語法。另外,我懷疑將'id'與DATEDIFF的結果進行比較會更有效率('2014-05-30 00:00:00','2014-05-05 00:00:00') – Strawberry

回答

0

這是您的查詢,格式因此可以讀取它:

SELECT E.ID, E.Name, E.StartDate, E.Repeats, A.ShowDate, DATEDIFF(E.StartDate, A.ShowDate) AS diff, 
     T.StartTime, DATE_ADD(A.ShowDate, INTERVAL T.StartTime HOUR_SECOND) AS ShowTime 
FROM Planner_Lessons AS E, 
    (SELECT DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY) as ShowDate 
     FROM `Planner_Tally` 
     WHERE (DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY)<='2014-05-30 00:00:00') 
     ORDER BY Id ASC 
    ) A LEFT JOIN 
    Planner_LessonTimes AS T 
    ON T.LessonID=E.ID 
WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0 AND A.ShowDate>=E.StartDate; 

你缺少隱性和顯性join語法。由於MySQL範圍規則,E中的列無法在逗號後識別。

SELECT E.ID, E.Name, E.StartDate, E.Repeats, A.ShowDate, DATEDIFF(E.StartDate, A.ShowDate) AS diff, 
     T.StartTime, DATE_ADD(A.ShowDate, INTERVAL T.StartTime HOUR_SECOND) AS ShowTime 
FROM Planner_Lessons E JOIN 
    Planner_LessonTimes T 
    ON T.LessonID = E.ID JOIN 
    (SELECT DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY) as ShowDate 
     FROM `Planner_Tally` 
     WHERE (DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY)<='2014-05-30 00:00:00') 
     ORDER BY Id ASC 
    ) A 
    ON MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0 AND A.ShowDate>=E.StartDate; 

我切換left join到內加入,這是因爲where子句撤消外部聯接。

0

您錯過了子查詢JOIN條件別名爲A。假設Planner_Tally表包含列ID,可以添加接合條件ON A.ID=E.ID如下所示

SELECT E.ID, E.Name, E.StartDate, E.Repeats, A.ShowDate, 
     DATEDIFF(E.StartDate, A.ShowDate) AS diff, T.StartTime, 
     DATE_ADD(A.ShowDate, INTERVAL T.StartTime HOUR_SECOND) AS ShowTime 
FROM Planner_Lessons AS E 
LEFT JOIN Planner_LessonTimes AS T ON T.LessonID=E.ID 
LEFT JOIN (
      SELECT DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY) as ShowDate,ID 
      FROM `Planner_Tally` 
      WHERE (DATE_ADD('2014-05-05 00:00:00',INTERVAL ID DAY)<='2014-05-30 00:00:00') 
) A ON A.ID=E.ID 
WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0 
     AND A.ShowDate>=E.StartDate 
ORDER BY E.Id ASC 
0

順便說一句,考慮以下...(ints是整數0-9表)

EXPLAIN 
SELECT * FROM ints WHERE '2014-05-05 00:00:00' + INTERVAL i DAY < '2014-30-30 00:00:00'\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: ints 
     type: index 
possible_keys: NULL 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
     rows: 10 
     Extra: Using where; Using index 
1 row in set (0.00 sec) 

EXPLAIN 
SELECT * FROM ints WHERE i < DATEDIFF('2014-05-30 00:00:00','2014-05-05 00:00:00')\G 
*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: ints 
     type: index 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
     rows: 10 
     Extra: Using where; Using index 
1 row in set (0.00 sec) 

正如您所看到的,雖然兩個查詢在邏輯上都是相同的,但第一個寄存器的NULL爲possible_keys

我們現在已經達到了我對指數知識的全部範圍。