简体   繁体   中英

Finding Difference between two columns in first and second rows using where clause in Lavavel Eloquent

I am developing lottery application using Laravel and I am try to query the lottery_result model using the WHERE clause in eloquent, when you look at the results below you will realize that, there are Event numbers with a difference of 1 number interval or some of the Event_Date has 7 days interval. Eg. Event: 2016-2017 and also Event: 2178-2179. How can I retrieve Event numbers with a difference of 1 or Event_Date with a difference of 7 days interval, with return results with columns(w5) == 29

    public function guider1()
        {
            $results = LotteryResult::where('w5', 29)
                        ->where('lottery_type_id', 6)->get();
            foreach($results as $result)
            {
                echo 'Event: '.$result->event . ' | event_date: '.$result->event_date. ' | w1: ' .$result->w5. '<br />';
            }
        }

Result below:

Event: 186 | event_date: 1966-04-16 | w1: 29 <br />
Event: 214 | event_date: 1966-10-29 | w1: 29 <br />
Event: 360 | event_date: 1969-08-16 | w1: 29 <br />
Event: 395 | event_date: 1970-04-18 | w1: 29 <br />
Event: 424 | event_date: 1970-11-07 | w1: 29 <br />
Event: 444 | event_date: 1971-03-27 | w1: 29 <br />
Event: 463 | event_date: 1971-08-07 | w1: 29 <br />
Event: 733 | event_date: 1976-10-09 | w1: 29 <br />
Event: 845 | event_date: 1978-12-09 | w1: 29 <br />
Event: 899 | event_date: 1979-12-22 | w1: 29 <br />
Event: 935 | event_date: 1980-08-30 | w1: 29 <br />
Event: 950 | event_date: 1980-12-13 | w1: 29 <br />
Event: 976 | event_date: 1981-06-13 | w1: 29 <br />
Event: 1018 | event_date: 1982-04-03 | w1: 29 <br />
Event: 1107 | event_date: 1983-12-17 | w1: 29 <br />
Event: 1186 | event_date: 1985-06-22 | w1: 29 <br />
Event: 1200 | event_date: 1985-09-28 | w1: 29 <br />
Event: 1203 | event_date: 1985-10-19 | w1: 29 <br />
Event: 1592 | event_date: 1993-04-03 | w1: 29 <br />
Event: 1840 | event_date: 1998-01-03 | w1: 29 <br />
Event: 1847 | event_date: 1998-02-21 | w1: 29 <br />
Event: 1908 | event_date: 1999-04-24 | w1: 29 <br />
Event: 1974 | event_date: 2000-08-12 | w1: 29 <br />
Event: 2016 | event_date: 2001-06-02 | w1: 29 <br />
Event: 2017 | event_date: 2001-06-09 | w1: 29 <br />
Event: 2052 | event_date: 2002-02-09 | w1: 29 <br />
Event: 2178 | event_date: 2004-07-10 | w1: 29 <br />
Event: 2179 | event_date: 2004-07-17 | w1: 29 <br />
Event: 2439 | event_date: 2009-07-11 | w1: 29 <br />
Event: 2532 | event_date: 2011-04-23 | w1: 29 <br />
Event: 2589 | event_date: 2012-05-26 | w1: 29 <br />
Event: 2882 | event_date: 2018-01-06 | w1: 29 <br />
Event: 2918 | event_date: 2018-09-15 | w1: 29 <br />
Event: 2934 | event_date: 2019-01-05 | w1: 29 <br />
Event: 2939 | event_date: 2019-02-09 | w1: 29 <br />
Event: 2978 | event_date: 2019-11-09 | w1: 29 <br />

What you're looking for is a LAG() function, which mysql has , but Laravel does not include in its API. If you need this functionality, you may wish to do it app-side, or use a raw query in Laravel

A possible example (not sure what output you are expecting):

-- for events with gap 1
SELECT event,
       event_date,
       w5,
       LAG(event, 1) OVER (
        PARTITION BY event
        ORDER BY event_date
    ) prev_eventnum
FROM lottery_result
WHERE w5 = 29
AND lottery_type_id = 6
AND event_num - prev_eventnum = 1
UNION
-- for event_dates 7 days apart
SELECT event,
       event_date,
       w5,
       LAG(event_date, 1) OVER (
        PARTITION BY event_date
        ORDER BY event
    ) prev_eventdate
FROM lottery_result
WHERE w5 = 29
AND lottery_type_id = 6
AND DATEDIFF(event_date,prev_eventdate) = 7;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM