从数据库中只用一列更改获取同一行的多行

时间:2016-04-20 08:10:19

标签: mysql laravel-5.2

我正在使用以下查询从数据库中获取记录。它已与许多其他表连接。一切工作正常,但问题是我得到多行相同的预订,这是因为预订表已加入付款表,付款表有多行反对一个预订,这就是为什么它重复完整记录。我想要的是显示其中包含所有付款行的单行,以便我可以遍历所有付款并显示它们,而不是一次又一次地显示整个预订记录。下面是我的查询。这是Laravel 5.2。

return $results = DB::table('resorts_reservation')
            ->join('resorts_resort', 'resorts_reservation.resortId', '=', 'resorts_resort.resortId')
            ->join('resorts_roomtype', 'resorts_reservation.roomTypeId', '=', 'resorts_roomtype.roomTypeId')
            ->join('resorts_customer', 'resorts_reservation.customerId', '=', 'resorts_customer.customerId')
            ->join('resorts_salesperson', 'resorts_reservation.salesPersonId', '=', 'resorts_salesperson.salesPersonId')
            ->join('resorts_payment', 'resorts_reservation.reservationId', '=', 'resorts_payment.reservationId')
            ->join('resorts_paymentmethod', 'resorts_payment.paymentMethodId', '=', 'resorts_paymentmethod.paymentMethodId')
            ->join('resorts_emailnotification', 'resorts_reservation.reservationId', '=', 'resorts_emailnotification.reservationId')
            ->join('resorts_resortcompany', 'resorts_resort.resortCompanyId', '=', 'resorts_resortcompany.resortCompanyId')
            ->select('resorts_reservation.totalAmount', 'resorts_reservation.saleDate', 'resorts_reservation.reservationId', 
                    'resorts_reservation.confirmNo', 'resorts_reservation.numberOfNights', 'resorts_reservation.checkInDate', 
                    'resorts_reservation.checkOutDate', 'resorts_reservation.numberOfAdults', 'resorts_reservation.numberOfChildren',
                    'resorts_reservation.totalInParty', 'resorts_reservation.notes', 'resorts_reservation.totalPrice',
                    'resorts_reservation.saleSource', 'resorts_reservation.depositAmount', 'resorts_reservation.confirmationSent',
                    'resorts_reservation.finalized',
                    'resorts_customer.firstName', 'resorts_customer.mobilePhone', 'resorts_customer.otherPhone',
                    'resorts_customer.email', 'resorts_customer.addressLineOne', 'resorts_customer.city',
                    'resorts_customer.country', 'resorts_customer.state_', 'resorts_customer.postalCode',
                    'resorts_resort.resortName', 
                    'resorts_roomtype.roomTypeDesc', 'resorts_roomtype.occupancy',
                    'resorts_salesperson.firstName as saleFirstName','resorts_salesperson.lastName as saleLastName',
                    'resorts_paymentmethod.methodType',
                    'resorts_payment.transactionNo',
                    'resorts_resortcompany.resortCompanyName')
            ->whereRaw($where)
            ->orderBy('reservationId', 'desc')
            ->get();

以下是查询返回的结果。您可以看到两个行都有相同的记录,只有“transactionNo”列更改。

[0] => stdClass Object
    (
        [totalAmount] => 2161.2
        [saleDate] => 2016-03-09 00:00:00
        [reservationId] => 30286
        [confirmNo] => 
        [numberOfNights] => 3
        [checkInDate] => 2016-04-22 00:00:00
        [checkOutDate] => 2016-04-25 00:00:00
        [numberOfAdults] => 6
        [numberOfChildren] => 0
        [totalInParty] => 6
        [notes] => 
        [totalPrice] => 2161.2
        [saleSource] => VRBO
        [depositAmount] => 2161.2
        [confirmationSent] => 0
        [finalized] => 0
        [firstName] => Michael
        [mobilePhone] => 505-321-2106
        [otherPhone] => 
        [email] => xxxxxxxx@gmail.com
        [addressLineOne] => 
        [city] => Albuquerque
        [country] => USA
        [state_] => NM
        [postalCode] => 87111
        [resortName] => San Francisco - Canterbury
        [roomTypeDesc] => 3 Bedroom Presidential
        [occupancy] => 6
        [saleFirstName] => Kristy
        [saleLastName] => Conlin
        [methodType] => CREDIT_CARD
        [transactionNo] => 7MG983973K453254C

        [resortCompanyName] => Wyndham
    )

[1] => stdClass Object
    (
        [totalAmount] => 2161.2
        [saleDate] => 2016-03-09 00:00:00
        [reservationId] => 30286
        [confirmNo] => 
        [numberOfNights] => 3
        [checkInDate] => 2016-04-22 00:00:00
        [checkOutDate] => 2016-04-25 00:00:00
        [numberOfAdults] => 6
        [numberOfChildren] => 0
        [totalInParty] => 6
        [notes] => 
        [totalPrice] => 2161.2
        [saleSource] => VRBO
        [depositAmount] => 2161.2
        [confirmationSent] => 0
        [finalized] => 0
        [firstName] => Michael
        [mobilePhone] => 505-321-2106
        [otherPhone] => 
        [email] => xxxxxxxx@gmail.com
        [addressLineOne] => 
        [city] => Albuquerque
        [country] => USA
        [state_] => NM
        [postalCode] => 87111
        [resortName] => San Francisco - Canterbury
        [roomTypeDesc] => 3 Bedroom Presidential
        [occupancy] => 6
        [saleFirstName] => Kristy
        [saleLastName] => Conlin
        [methodType] => CREDIT_CARD
        [transactionNo] => 
        [resortCompanyName] => Wyndham
    )

我想要的是下面的内容:

[0] => stdClass Object
    (
        [totalAmount] => 2161.2
        [saleDate] => 2016-03-09 00:00:00
        [reservationId] => 30286
        [confirmNo] => 
        [numberOfNights] => 3
        [checkInDate] => 2016-04-22 00:00:00
        [checkOutDate] => 2016-04-25 00:00:00
        [numberOfAdults] => 6
        [numberOfChildren] => 0
        [totalInParty] => 6
        [notes] => 
        [totalPrice] => 2161.2
        [saleSource] => VRBO
        [depositAmount] => 2161.2
        [confirmationSent] => 0
        [finalized] => 0
        [firstName] => Michael
        [mobilePhone] => 505-321-2106
        [otherPhone] => 
        [email] => xxxxxxxx@gmail.com
        [addressLineOne] => 
        [city] => Albuquerque
        [country] => USA
        [state_] => NM
        [postalCode] => 87111
        [resortName] => San Francisco - Canterbury
        [roomTypeDesc] => 3 Bedroom Presidential
        [occupancy] => 6
        [saleFirstName] => Kristy
        [saleLastName] => Conlin
        [methodType] => CREDIT_CARD
        array(
            [transactionNo] => 7MG983973K453254C
            [transactionNo] => 
        )
        [resortCompanyName] => Wyndham
    )

1 个答案:

答案 0 :(得分:0)

您可以使用GROUP-CONCAT功能对每个预订的所有付款交易编号进行分组。

来自MySQL docs

  

此函数返回带有连接非NULL的字符串结果   一组中的值。如果没有非NULL值,则返回NULL。

您的查询将如下所示:

SELECT resorts_reservation.totalAmount, ..., GROUP_CONCAT(resorts_payment.transactionNo separator ', ') as transactionNoList
WHERE...

希望这是有道理的,如果没有,我会很乐意澄清。

汤姆拉什曼