2013-07-05 123 views
0

如果有人可以幫助我與這一個我有這些表我想要得到兩個日期之間的所有預訂,並知道是否有任何一個是由其他人完成或它是失敗的。Mysql查詢左加入訪問變量

表:登記

id | date  | date_end | repeat | day_of_week | user_id | price 
--------------------------------------------------------------------- 
1 2013-07-01 0000-00-00 1  3    1   20 
2 2013-07-16 0000-00-00 1  -1    1   10 

表:Bookings_done_by_other

id | date  | user_id | booking_id 
--------------------------------- 
1 2013-07-01 2   2 
2 2013-07-13 2   2 

表:Bookings_fail

id | date  | booking_id 
--------------------------- 
1 2013-07-01 2 
2 2013-07-11 2 

表:帳簿

id 
-- 
1 
.... 
500 

這是我的查詢,它運行良好,但我無法處理它給我所有我想要的。

SELECT f.date as fail, b.id, b.date, a.showdate, DATEDIFF(b.date, a.showdate) AS diff 
FROM bookings as b 
LEFT JOIN bookings_fail f ON (b.id = f.booking_id and DATE(f.date) = DATE(a.showdate)) 
, 
(
SELECT DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) as showdate 
FROM `tally` 
WHERE (DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) <= '2013-07-20 00:00:00') 
ORDER BY Id ASC 
) a 
WHERE 
MOD(DATEDIFF(b.date, a.showdate), b.repeat) = 0 
AND 
DATE(a.showdate)>= DATE(b.date) 

時就是這個樣子是拋出錯誤不能看到在左側加入a.showdate,當我移動左手旁邊的「一」表拋出錯誤不能看b.id加入讓有什麼如何讓這個連接工作?

我想獲得導致這樣的事情

id | showdate | fail | by_other | 
----------------------------- 
1 2013-07-01 NULL 2 
2 2013-07-01 1  NULL  //Or date 
1 2013-07-03 NULL NULL 
1 2013-07-04 NULL NULL 
1 2013-07-05 NULL NULL 
1 2013-07-06 NULL NULL 
............................. 
1 2013-07-20 NULL NULL 

很抱歉,如果我的英語不太好,在此先感謝大家誰可以提供幫助。

這裏的一些圖片,希望越來越清楚,我無法解釋什麼,我想正確

這是預訂 Booking table

這是失敗

Fail table

我不能把超過2個鏈接所以這就是爲什麼這兩個就像文字 所以當我想要得到我的預訂我做這個

s16.postimg.org/l00k1math/image.jpg

我想要做的是

s12.postimg.org/5o5hbnmdp/image.jpg

但不僅接受預訂ID爲1我不會被b.id = un.booking_id,然後如果有記錄無法顯示是如何在最後畫面

感謝您的耐心

+0

您提供的數據似乎沒有意義。 * fail *和* other *表中的記錄都具有相同的booking_id(即2),但它們的日期都不匹配預訂表中預訂號2的日期。那是對的嗎?輸出失敗列中的1是什麼意思? by_other專欄中的2是什麼意思?重複欄的用途是什麼? –

+0

對不起,也許我沒有解釋清楚日期只在預訂表中很重要,它們會出現在這個循環中,這是通過Tally表完成的,所以當某個預訂處於給定日期之間或者處於期間時會出現在這個語句中,並且在這裏,如果在計數「showdate」失敗或預訂由其他用戶完成的某些日期後,我想在左邊加入以添加,以便日後可以顯示。如果我把這張支票放在我的where子句中,它就是制動我需要的循環,因爲我的預訂應該重複。我希望這使得任何的立場 – Alex

+0

我仍然不明白。在第二個結果行('2 2013-07-01 1 NULL')中,id 2從哪裏來?這是否意味着預訂ID?當天預訂的ID爲1,而不是2,所以對我來說沒有意義。爲什麼它會失敗?由於日期與失敗日期相符?如果是這樣,爲什麼第一個結果行不顯示失敗,因爲它具有相同的顯示日期?爲什麼前兩個結果有相同的演出日期呢?你有兩個'2013-07-01',但沒有'2013-07-02'。 –

回答

1

我想我終於UND知道你正在嘗試做什麼。我的建議是格式化您的查詢是這樣的:

SELECT b.id, a.showdate, f.id as fail, o.id as other 
FROM (
    SELECT DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) as showdate 
    FROM `tally` 
    WHERE (DATE_ADD('2013-07-01 00:00:00',INTERVAL Id DAY) <= '2013-07-20 00:00:00') 
    ORDER BY Id ASC 
) a 
LEFT JOIN Bookings b ON (
    MOD(DATEDIFF(b.date, a.showdate), b.repeat) = 0 AND 
    DATE(a.showdate)>= DATE(b.date)    
) 
LEFT JOIN Bookings_fail f ON (
    b.id = f.booking_id AND 
    DATE(f.date) = DATE(a.showdate) 
) 
LEFT JOIN Bookings_done_by_other o ON (
    b.id = o.booking_id AND 
    DATE(o.date) = DATE(a.showdate) 
) 

可以通過從產生一個表中選擇啓動,並加入與該預訂表。一旦你有兩個加入,可以很容易地加入基於a.showdateb.id字段的任何其他表。

我已經根據您的數據或多或少地創建了一個SQL Fiddle示例,因此您可以看到它是如何工作的。 http://sqlfiddle.com/#!2/7e151/1

+0

非常感謝我想要的東西 – Alex