MYSQL获取范围内的所有匹配项
此处为数据库结构:MYSQL获取范围内的所有匹配项,mysql,join,group-by,Mysql,Join,Group By,此处为数据库结构: BOOKINGS ID | CLIENT_ID | CLIENT_BOOKING_NMBR | SELL_PRICE 1 | 1 | 1 | 14500 2 | 3 | 1 | 11000 3 | 2 | 1 | 13000 4 | 1 | 2 | 18500 5
BOOKINGS
ID | CLIENT_ID | CLIENT_BOOKING_NMBR | SELL_PRICE
1 | 1 | 1 | 14500
2 | 3 | 1 | 11000
3 | 2 | 1 | 13000
4 | 1 | 2 | 18500
5 | 1 | 3 | 12100
...
BOOKINGS_PAYMENTS -> ALL PAYMENTS DONE TO VENDORS PER BOOKING
BOOKING_ID | AMOUNT | CURRENCY_ID | LOCAL_CURRENCY_AMOUNT
1 | 500 | 1 | 10000
1 | 180 | 2 | NULL
2 | 200 | 1 | 4000
4 | 900 | 1 | 18000
...
BOOKINGS_COLLECTIONS -> COLLECTED FROM CLIENT
CLIENT_ID | BOOKINGS_RANGE_START | BOOKINGS_RANGE_END | LOCAL_CURRENCY_AMOUNT | NET_AMOUNT
1 | 1 | 3 | 5000 | NULL
2 | 1 | 1 | 11000 | NULL
1 | 1 | 3 | 3000 | 2910
1 | 1 | 3 | 37100 | 35987
...
当客户付款时,我们使用“客户预订”NMBR id对其进行注册,以识别他为哪些预订付款,如果他只为一个预订付款,则“预订范围”和“预订范围”列的开始和结束值将相同。“净金额”列保留我们在销售点使用佣金后从银行实际收到的金额
因此,如果我提供客户编号和预订编号/预订范围,我需要获得:
BOOKING_ID | COST | PAYMENTS_COUNT | LOCAL_PAYMENTS_COUNT | COLLECTIONS_COUNT | NET_COLLECTIONS_COUNT
1 | 10000 | 2 | 1 | 3 | 2
4 | 18000 | 1 | 1 | 3 | 2
5 | NULL | 0 | 0 | 3 | 2
BOOKING_ID | COST | PAYMENTS_COUNT | LOCAL_PAYMENTS_COUNT | COLLECTIONS_COUNT | NET_COLLECTIONS_COUNT
1 | 10000 | 2 | 1 | 3 | 2
4 | 18000 | 1 | 1 | 3 | 2
5 | NULL | 0 | 0 | 3 | 2
如果我只查询我需要的前3个结果,则一切正常:
SELECT
b.id,
SUM(bP.LOCAL_CURRENCY_AMOUNT) AS cost, COUNT(bP.*) AS payments_count, COUNT(bP.LOCAL_CURRENCY_AMOUNT) AS local_payments_count,
FROM bookings b
JOIN bookings_payments bP ON b.id = bP.bookingId
WHERE ((b.clientId = 1) AND (b.clientBookingNumber >= 1) AND (b.clientBookingNumber <= 3))
GROUP BY b.id
ORDER BY b.id
但当我尝试这个:
SELECT
b.id,
SUM(bP.LOCAL_CURRENCY_AMOUNT) AS cost, COUNT(bP.*) AS payments_count, COUNT(bP.LOCAL_CURRENCY_AMOUNT) AS local_payments_count,
COUNT(c.*) AS collections_count, COUNT(c.NET_AMOUNT) AS net_collections_count
FROM bookings b
JOIN bookings_payments bP ON b.id = bP.bookingId
JOIN bookings_collections c ON b.clientId = c.clientId AND c.bookingRangeStart <= b.clientBookingNumber AND c.bookingRangeEnd >= b.clientBookingNumber
WHERE ((b.clientId = 1) AND (b.clientBookingNumber >= 1) AND (b.clientBookingNumber <= 3))
GROUP BY b.id
ORDER BY b.id
有线索吗
BOOKING_ID | COST | PAYMENTS_COUNT | LOCAL_PAYMENTS_COUNT | COLLECTIONS_COUNT | NET_COLLECTIONS_COUNT
1 | 10000 | 4 | 4 | 4 | 4
4 | 18000 | 4 | 4 | 4 | 4
5 | NULL | 4 | 4 | 4 | 4