我想刪除具有相同norad_cat_id
的SQL數據庫中的行。由於我的數據庫中的數據每天都會更新,因此將添加具有相同norad_cat_id
的新行。我想要做的是刪除所有具有相同的norad_cat_id
的行,只留下最近添加的行。到目前爲止,我已經嘗試從堆棧溢出(其中沒有工作)的幾個解決方案:Laravel - 刪除SQL數據庫中的重複行
1:
DB::table('satellites')->select('norad_cat_id')->distinct()->delete();
2:
$deleteDuplicates = DB::table('satellites as n1')
->join('satellites as n2', 'n1.norad_cat_id', '>', 'norad_cat_id')
->where('n1.norad_cat_id', '=', 'n2.norad_cat_id')
->delete();
我的數據庫名字爲satellite
。
TL; DR:刪除我的數據庫具有相同的norad_cat_id
行
編輯:
這裏是我的全部功能:
public function displayer(){
$api = new Client([
'base_uri' => 'https://www.space-track.org',
'cookies' => true,
]); $api->post('ajaxauth/login', [
'form_params' => [
'identity' => '#',
'password' => '#',
],
]);
$response = $api->get('basicspacedata/query/class/satcat/orderby/INTLDES%20desc/limit/2/metadata/false');
$data = json_decode($response->getBody()->getContents(), true);
foreach ($data as $attributes) {
$attributes = array_change_key_case($attributes, CASE_LOWER);
Satellite::create($attributes);
}
$deleteDuplicates = DB::table('satellites as n1')
->join('satellites as n2', 'n1.created_at', '<', 'n2.created_at')
->where('n1.created_at', '=', 'n2.created_at') ->delete();
$api->get('ajaxauth/logout');
return redirect('/');
}
編輯:
I我想我需要給出一個清晰的解釋,我想實現的目標是:我的數據庫會自動更新。我希望能夠做的是創建一個行,如果norad_cat_id
不存在於數據庫中。如果它已經存在,我希望它採用與norad_cat_id
相同的行,將其刪除並僅使用我的數據庫中的時間戳保留最近的行。所以我有每個norad_cat_id
之一。
我正在看着這個:https://laravel.com/docs/5.4/eloquent#deleting-models和https://laravel.com/docs/5.4/database#running-queries。也許我可以使用這個?
編輯2: 任何人都可以揭示出這個代碼,我寫了一些光:
DB::select(DB::raw('DELETE n1 FROM satellites n1, satellites n2 WHERE n1.id < n2.id AND n1.norad_cat_id = n2.norad_cat_id'));
我看了一些答案和其他問題,並試圖想出一些東西。
你有沒有任何主鍵或唯一的ID在你的表? –
在mysql或sql-server之間進行選擇,你不能同時使用 – GuidoG
可以嘗試在Laravel中運行raw sql嗎?例如 DB :: select(DB :: raw(「SELECT * FROM some_table WHERE some_col ='$ someVariable'」)); 看看如何刪除mysql上的重複行; https://stackoverflow.com/questions/4685173/delete-all-duplicate-rows-except-for-one-in-mysql –