2014-01-14 20 views
0

我有兩個表連接的問題。在這種情況下,表1(預訂表)和表2(預訂條目)。mySQL兩張表在多個NULLS上加入LEFT

我需要一個查詢來獲取Table1中的所有行WHERE表2中的member_id(僅在此存在而不是在table1中),並且可以搜索BOTH表中的Vip_id。

SELECT vb.* , DATE_FORMAT(vb.bookingdate, '%W %D %M') bookingdate, DATE_FORMAT(vb.bookingrsvp, '%W %D %M') bookingrsvp, concat(sl.state, ' - ', sl.store) store, sl.ADD1, sl.ADD2, sl.SUBURB, sl.PHONE , ve.vip_entry_leadid 
FROM vip_booking vb 
INNER JOIN storelocator sl ON (vb.storeid = sl.id) 
LEFT JOIN vip_entries ve ON (vb.vipid = ve.vip_id AND ve.vip_entry_leadid = '" . $_GET["leadid"] . "') 
WHERE vb.vipid = " . $_GET["vipid"] . " 
    AND DATE(vb.bookingdate) >= CURDATE() 
    AND ve.vip_entry_leadid IS NULL 
    AND ve.vip_id IS NULL 
GROUP BY vb.storeid ORDER BY sl.state, sl.store 

基本上我想在這裏實現的是選擇一個特定的VIP活動,當前登錄的用戶尚未有太多的條目的所有商店部分所有預訂?如果它是一個單一的領域即。 vip_entries.vip_id = vip_booking.vipid然而,如果這是一個不同的事件,那麼用戶可以多次進入條目表?

上面的查詢有效,但我不知道我是否已經正確寫入,因爲我想使用連接並避免子查詢。

+0

首先,將您的ve條件納入ON子句 – Strawberry

+0

您能否解釋一下? – Bass

+0

基本上,LEFT JOIN y ON y.id = x.id WHERE x ...與INNER JOIN y相同y ON y.id = x.id WHERE x ... – Strawberry

回答

0
  1. 上面的查詢工作,但是我不知道我是否已經正確地寫它

不幸的是,雖然前面的SQL在MySQL的作品,您的查詢是無效的ANSI SQL。僅GROUP BY柱和聚合函數可以是SELECTed

  • 我想用連接和避免子查詢。
  • 據我所知,沒有子查詢,你只能取vb.storeid如下

    SELECT vb.storeid 
    FROM vip_booking vb 
    INNER JOIN storelocator sl ON (vb.storeid = sl.id) 
    LEFT JOIN vip_entries ve ON (vb.vipid = ve.vip_id AND ve.vip_entry_leadid = '$leadid') 
    WHERE vb.vipid = $vipid 
        AND DATE(vb.bookingdate) >= CURDATE() 
        AND ve.vip_entry_leadid IS NULL 
        AND ve.vip_id IS NULL 
    GROUP BY vb.storeid; 
    

    正確的SQL與子查詢:

    在我看來下面的查詢是正規SQL爲你想要的。

    SELECT 
        vb.*, 
        DATE_FORMAT(vb.bookingdate, '%W %D %M') bookingdate, 
        DATE_FORMAT(vb.bookingrsvp, '%W %D %M') bookingrsvp, 
        CONCAT(sl.state, ' - ', sl.store) store, 
        sl.ADD1, sl.ADD2, sl.SUBURB, sl.PHONE , ve.vip_entry_leadid 
    FROM 
        (SELECT DISTINCT 
         vb.storeid 
        FROM 
         vip_booking vb 
        LEFT JOIN 
         vip_entries ve ON (vb.vipid = ve.vip_id AND ve.vip_entry_leadid = '" . $_GET["leadid"] . "' 
        WHERE 
         vb.vipid = " . $_GET["vipid"] . " 
         AND DATE(vb.bookingdate) >= CURDATE() 
         AND ve.vip_entry_leadid IS NULL 
         AND ve.vip_id IS NULL) x 
    INNER JOIN 
        storelocator sl ON (x.storeid = sl.id) 
    ORDER BY 
        sl.state, sl.store; 
    
    +0

    您能否檢查sqlfiddle.com/#!8/c3963/4? – Bass

    +0

    @貝斯我4個小時前試過,http://sqlfiddle.com/#!8/c3963/4。這個網址永遠不會停止「構建」,我無法測試您的示例數據。 Chrome和IE都不能正常工作:-( –

    +0

    )是的,我試過多個瀏覽器,認爲Chrome瀏覽器出現錯誤,結果顯示所有內容都不能正常工作!它有數據和記錄集,我想要實現我還能做什麼? – Bass

    0

    您可以在問題中張貼一些示例數據。

    您的查詢似乎在vip_entries上執行了LEFT JOIN,然後在2個字段中檢查NULL以確保沒有找到記錄(如果存在,最好檢查vip_entries的唯一ID字段)。但是,您隨後將返回值爲vip_entries.vip_entry_leadid的值始終爲空。

    此外,您正在使用GROUP BY store_id。這將每個store_id帶回一行,但其他值將來自該store_id的未定義行(在大多數數據庫中,這將失敗)。我懷疑看看你的描述你實際上想要爲每個事件/商店ID(這可能是一個獨特的組合)帶回一行,在這種情況下,你似乎不需要GROUP BY。