оставьте соединение и верните только последнюю запись из правой таблицы, используя LARAVEL 6.5.0 - PullRequest
0 голосов
/ 06 февраля 2020
Table 1
----------
NameID     Name
------------------
1           A
2           B
3           C
-----------------

Table 2
--------------------
ID   NameID   Order   
--------------------
1      1      Sugar
2      1      Salt 
3      2      Garlic 
4      2      Sugar
5      2      Onion
6      3      Oil
7      3      Black pepper 

Я хочу вернуть только самую последнюю и только одну запись для nameID из правой таблицы. Я не знаю, какой код использовать

Это результат, который я хочу вернуть

RESULT
----------------------------
Name           Order
---------------------------
A              Salt  
B              Onion    
C              Black pepper

Контроллер. php

return DB::table('table1')
->leftjoin('table2','table1.nameID','=','table2.nameID')
-get();

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

попробуйте

$data = Table1::select('Table1.Name', 'Table2.Order','Table2.ID')
->leftJoin('Table2', function($query) {
   $query->on('Table1.NameID','=','Table2.NameID')
        ->whereRaw('Table2.ID IN (select MAX(a2.ID) from Table2 as a2 join Table1 as u2 on u2.NameID = a2.NameID group by u2.NameID)');
})->get();

Отредактировано:

$data = Table1::select('Table1.Name', 'Table2.Order','Table2.ID')
0 голосов
/ 06 февраля 2020

Вы можете попробовать это ниже скрипт-

SELECT B.NameID, B.Name, C.[Order]
FROM 
(
    SELECT Nameid,MAX(ID) ID
    FROM table_2
    GROUP BY NameID
)A
INNER JOIN Table_1 B ON A.NameID = B.NameID
INNER JOIN Table_2 C ON A.NameID = C.NameID AND A.ID = C.ID 
0 голосов
/ 06 февраля 2020

Использование не существует для фильтрации

select Name, Order

from Table1 a 
inner join
(
Select a.NameID, Order from Table2 a 
where not exists(select 1 from Table2 b where a.NameID  = b.NameID  and a.ID < b.ID)
)b on a.NameID = b.NameID
...