mySQL两个表LEFT JOIN在多个NULLS上

时间:2014-01-14 22:41:30

标签: mysql

我有一个关于两个表连接的问题。在这种情况下,表1(预订表)和表2(预订条目)。

我需要一个查询来获取Table1中的所有行。表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那么那将是okm但是如果用户可以多次进入条目表,只要它是一个不同的事件?

上面的查询有效,但我不知道我是否正确编写了它,因为我想使用连接并避免子查询。

2 个答案:

答案 0 :(得分:0)

  
      
  1. 以上查询有效,但我不知道我是否已正确编写
  2.   

不幸的是,虽然前面的SQL在MySQL中运行,但您的查询在ANSI SQL中无效。只有GROUP BY列和聚合函数可以是SELECTed

  
      
  1. 我想使用连接并避免子查询。
  2.   

据我所知,没有子查询,您只能按如下方式获取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;

答案 1 :(得分:0)

请在问题中发布一些样本数据。

您的查询似乎在vip_entries上执行LEFT JOIN,然后检查2个字段中的NULL以确保没有找到记录(可能更好地检查vip_entries的唯一ID字段,如果存在)。但是你然后带回值vip_entries.vip_entry_leadid,它始终为null。

此外,您正在使用GROUP BY store_id。这将为每个store_id返回一行,但其他值将来自该store_id的未定义行(在大多数数据库中,这将失败)。我怀疑看你的描述你实际上想要为每个事件/商店ID(这可能是一个独特的组合)带回一行,在这种情况下,你似乎不需要GROUP BY。