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
  • 以当地货币计算的预订成本金额
  • 此预订的付款计数
  • 已更新本地货币金额的此预订的付款计数
  • 此预订所属的收藏范围计数
  • 已更新净金额的此预订所属的收款范围计数
  • e、 g.当客户1为其1-3系列预订付款时,我需要获得:

    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