Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [inny]Jak połączyć dwie kolekcje po kluczu, Cos jak left join
fumfel20
post 23.09.2018, 11:43:47
Post #1





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Witam, Panowie mam dwie kolekcje, pierwsza to ilosc ktora zostala wyprodukowana (part_no, qty) danego panela:


Druga to taki ala plan:


Problem polega na tym ze pochodzą z oddzielnych baz danych wiec nie moge tego polaczyc joinem. Co trzeba zrobic zeby uzyskac taki rezultat:
  1. 0 => {#16621
  2. +"ifsCode": "KE.206.090.LV" <- to polaczyc z part_no
  3. +"description": "720x390x18(972) Base L Cnr Back B Lava (8mm grv)"
  4. +"minStock": "25"
  5. +"maxStock": "25"
  6. +"demand": "1"
  7. +"finishedStock": "45"
  8. +"inStock": "42"
  9. +"cover": "45"
  10. +"currentStock": "42"
  11. +"autoPlan": "0"
  12. +"totalAutoPlan": "0"
  13. +"qty": null <- a tu wstawic QTY ale z poprzedniej kolekcji
  14. }


Powiem szczedrze ze wczoraj szukalem rozwiazania ze 3 godziny i nie udalo mi sie. Bede wdzięczny za pomoc. PS: Framework to Laravel 5.6
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 12:00:53
Post #2





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


A kto Ci powiedzial ze nie mozesz zrobic joina z dwoch baz danych ? Jesli te dwie bazy sa z jednego polaczenia to mozesz to zrobic tak:

  1. SELECT * FROM db1.table1 t1 LEFT JOIN db2.table2 t2 ON t1.id = t2.id


Ewentualnie jesli to jest z dwoch innych polaczen uzyj :

https://dev.mysql.com/doc/refman/8.0/en/fed...age-engine.html

Ale to wymaga nowszych wersji mysql.

Ostatecznie mozesz pobrac dane przemapowac na tablice gdzie kluczem bedzie part_no i przeleciec w drugiej petli wycisgajac dane weflug klucza part_no zwracajac uwage na to aby bylo aktywne polaczenie do tej tabelki z part_no

Ten post edytował rad11 23.09.2018, 12:38:47
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 12:14:47
Post #3





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Sorki, nie napisałem chyba wszystkiego. Pierwsza baza to jest baza Oracle do której sie podpiąłem a druga to jest moja lokalna.
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 12:43:34
Post #4





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


To raczej nie unikniesz trzeciej opcji.
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 12:45:53
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Wczesniej rozwiazałem ten problem ale połowicznie, bo po prostu zawartosc tej kolekcji zapisuje w lokalnej bazie danych i potem do niej juz łączę joinem. Działa ale za dlugo to trwa. Az ciężko uwierzyć ze nie ma innej opcji.
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 12:47:30
Post #6





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Nie powinno to dlugo trwac pokaz jak to robiles i pokaz create tych tabelek

Ten post edytował rad11 23.09.2018, 12:49:09
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 13:09:42
Post #7





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Problem polega na tym ze czasem paru userów chce sprawdzić w tym samym czasie to samo albo inny zakres dat wiec dlugo czekają.

Nie jestem teraz przy projekcie ale wyglada to mniej wiecej tak: User wybiera na przyklad date 2018-09-17. po tym nastepuje kasowanie tabeli lokalnej History, nastepnie zapytanie pobiera z bazy Oracle wszystkie rekordy dla okreslonej grupy produktow od tej daty wlacznie. To co zostalo pobrane insertem importowane jest do tabeli history i ostatnie zapytanie juz wyciaga liste produktów wszystkich a join łączy to po part_no. TO wszystko
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 13:16:54
Post #8





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Moim zdaniem nie tedy droga. Powiniennes zrobic skrypt ktory bedzie ta tabelke aktualizowal co jakis czas (cron), dodac odpowiednie indexy na kolumny itd.

Ten post edytował rad11 23.09.2018, 13:17:16
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 13:29:32
Post #9





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Ok, zainteresowales mnie. Tylko prawdopodobnie to bedzie wygladalo tak ze musi tam byc historia nawet z przed roku. Nawet nie chce myslec ile tam bedzie rekordow.
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 13:33:10
Post #10





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


To dowiedz sie ile bedzie tych rekordow i wtedy bedziesz sie martwic ale chyba w miliardach to nie bedzie. Ewentualnie jak bedzie bardzo bardzo duzo to spróbuj uzyc https://dev.mysql.com/doc/refman/5.7/en/par...ning-types.html

Oczywiscie piszac skypt mialem na mysli komende w Laravel itd.

Ten post edytował rad11 23.09.2018, 13:38:38
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 14:42:37
Post #11





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Ok sprawdzilem. To bedzie okolo 5 mln od poczatku roku :/ I stale rosnie
Go to the top of the page
+Quote Post
Pyton_000
post 23.09.2018, 14:54:02
Post #12





Grupa: Zarejestrowani
Postów: 7 816
Pomógł: 1374
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Dla czego nie pobierzesz od razu kolekcji i jako klucz ustawisz part_no a potem po prostu 1 pętlą przelecisz po quantity nadając wartości
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 15:12:49
Post #13





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Tu chyba wychodzą moje braki wiedzy bo nie wiem jak i jakos jak staralem sie wyszukac o tym informacje to nic mi nie wychodzilo, znalazlem tez w dokumentacji cos takiego:

  1. $latestPosts = DB::table('posts')
  2. ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
  3. ->where('is_published', true)
  4. ->groupBy('user_id');
  5.  
  6. $users = DB::table('users')
  7. ->joinSub($latestPosts, 'latest_posts', function($join) {
  8. $join->on('users.id', '=', 'latest_posts.user_id');
  9. })->get();


Ale nie zadzialalo. Pomozesz?
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 15:21:01
Post #14





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ale co Ty tymi dwoma zapytaniami probujesz uzyskac ? To sa te dwie tabelki o ktorych pisales ?
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 15:25:03
Post #15





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Nie to jest przyklad z dokumentacji. Juz po prostu probowalem olac kolekcje i laczyc zapytania ale ostatecznie wolalbym sie skupic na polaczeniu kolekcji. W jakis sposob
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 15:38:47
Post #16





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


To prosba abys nie dawal mi przykladow z dokumentacji tylko kod ktory piszesz ok?☺
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 15:48:40
Post #17





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


Ok. Ale kodu tych kolekcji nie bede Ci dawal bo jak kolekcja wyglada to wiesz smile.gif. Zainteresowal mnie ten post kolegi Pyton_000. Moze faktycznie istnieje jakis sposob zeby to zrobić kolekcjami.
Tu jest kod gdzie pobieram kolekcje. ifsCode to jest to samo co part_no:
Kod
$planDate = $request->planDate;

        $imaPlan = collect(DB::connection('mysql')->select("
            select ip.ifsCode, ip.description, ip.minStock, ip.maxStock, ip.demand, ip.finishedStock, ist.inStock ,ip.cover,
            (CASE WHEN ist.inStock is null then 0 else ist.inStock END) as currentStock, ip.autoPlan ,ip.totalAutoPlan, ith.qty
            from imaProdPlan ip
            left join imaTransactionHistory ith on ith.partNo = ip.ifsCode
            left join imaStock ist on ist.partNo = ip.ifsCode
            where left(ip.created_at,10) = '$planDate'
        "));


        $ifsCodes = DB::connection('mysql')->select("SELECT distinct ifsCode from imaProdPlan");
        foreach ($ifsCodes as $key) {
            $ifsCodestr[] = "'".$key->ifsCode . "'";
        }
        $ifsCodestr = implode(", ", $ifsCodestr);
        //return dd($ifsCodestr);
        $th = collect(DB::connection('oracle')->select("select part_no, sum(quantity) as qty  from (
            select * from IFSAPP.INVENTORY_TRANSACTION_HIST2
            where contract = 'B001'
            and part_no in ($ifsCodestr)
            and to_char(date_applied, 'yyyy-mm-dd')
            BETWEEN to_char(to_date('$planDate','yyyy-mm-dd')-1,'yyyy-mm-dd') and to_char(to_date('$planDate','yyyy-mm-dd')+6,'yyyy-mm-dd')
            and DIRECTION = '+'
            and TRANSACTION = 'Receipt into Inventory'
            and LOCATION_NO = 'IMAPROD1')
            group by part_no"));


Ten post edytował fumfel20 23.09.2018, 15:52:25
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 15:50:41
Post #18





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Istnieje nawet Ja Ci taka opcje podalem
Go to the top of the page
+Quote Post
fumfel20
post 23.09.2018, 15:55:54
Post #19





Grupa: Zarejestrowani
Postów: 44
Pomógł: 0
Dołączył: 17.09.2015

Ostrzeżenie: (0%)
-----


No tak, nie widzialem Twojego edytowanego postu. Wlasnie problem polega na tym ze nie wiem jak sie za to zabrac. Domyslam sie ze metida map z kolekcji. Wracam do dokumentacji i jeszcze raz sprawdze.
Go to the top of the page
+Quote Post
rad11
post 23.09.2018, 16:01:32
Post #20





Grupa: Zarejestrowani
Postów: 1 242
Pomógł: 179
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Spróbuj tak:

  1.  
  2. $firstCollection = $collection->keyBy('part_no')->all();
  3.  
  4. $secodCollection = $collection->map(function ($row) use ($firstCollection){
  5.  
  6. $row['qty'] = $firstCollection[$row['ifsCode']]['qty'] questionmark.gif null;
  7.  
  8. // lub $row->qty = $firstCollection[$row->ifsCode]->qty questionmark.gif null
  9.  
  10. return $row;
  11.  
  12. });


Ten post edytował rad11 23.09.2018, 16:06:42
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.10.2019 - 10:22