我有一个关于两个表连接的问题。在这种情况下,表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但是如果用户可以多次进入条目表,只要它是一个不同的事件?
上面的查询有效,但我不知道我是否正确编写了它,因为我想使用连接并避免子查询。
答案 0 :(得分:0)
- 以上查询有效,但我不知道我是否已正确编写
醇>
不幸的是,虽然前面的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;
答案 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。