Как оптимизировать мой код в Mysql? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть три таблицы, называемые t_asset,t_device and t_asset_device. Взаимосвязь между t_asset и t_device состоит из нескольких пар. Каждый столбец таблицы:

t_asset :id , asset_name,asset_code,create_time,creator
t_device:id, device_name,device_code,latitude,longitude,create_time,creator
t_assets_device:id,asset_id,device_id,create_time,creator

Теперь я хочу получить все t_asset иширота, долгота первого устройства, поэтому я пишу код и функцию следующим образом:

fun_getLatitudeByAssetId(`assetId`  varchar(50)){
BEGIN
declare v_latituede DECIMAL(10,5) DEFAULT(-1) ; 
select  latitude  into  v_latituede  
from t_device tDevice
 inner join t_assets_device  tAssetsDevice
 on tAssetsDevice.asset_id=assetId and
  tDevice.id=tAssetsDevice.device_id
 and  tDevice.latitude!=-1
  ORDER BY tDevice.id desc
    limit 0,1; 
return v_latituede; 
END
}

fun_getLongititueByAssetId(`assetId`  varchar(50)){
BEGIN
declare v_longititue DECIMAL(10,5) DEFAULT(-1) ; 
select  longititueinto  v_longititue
from t_device tDevice
 inner join t_assets_device  tAssetsDevice
 on tAssetsDevice.asset_id=assetId and
  tDevice.id=tAssetsDevice.device_id
  and  tDevice.latitude!=-1
  ORDER BY tDevice.id desc
    limit 0,1; 
return v_longititue ; 
END
}

Окончательный запрос sql:

select tAsset.*,fun_getLatitudeByAssetId(tAsset.id) latitude,
fun_getLongititueByAssetId(tAsset.id) longititue from t_asset tAsset 

Кажется, у меня есть запросширота и долгота два раза. Если я хочу получить другое поле из t_device, я не хочу писать другую функцию, такую ​​как fun_getDeviceCodeByAssetId, Как я могу оптимизировать свой код?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Я не думаю, что функция или процедура - это путь, почему бы просто не определить представление, которое имеет asset_id + все остальные поля, которые вы хотите?Тогда просто присоединяйтесь к нему на asset_id, а не вызывайте функции.В дополнение к тому, чтобы быть просто чище, я бы беспокоился о производительности со строками, а не о множественной обработке с помощью функционального подхода (это полная догадка, у меня недостаточно глубоких знаний о MySQL, чтобы знать, как она обрабатывается)

0 голосов
/ 05 июня 2018

Действительно ли это необходимо делать с функциями? Потому что вы можете использовать представления.Например, вы можете сделать это.

create view latitudeLongitude as
select  latitude,longitude,asset_id  
from t_device tDevice
inner join t_assets_device  tAssetsDevice
on tDevice.id=tAssetsDevice.device_id
and tDevice.latitude!=-1; 

Наконец, ваш последний выбор должен выглядеть следующим образом:

select tAsset.*,latitudeLongitude.latitude,
latitudeLongitude.longititue 
from t_assettAsset inner join latitudeLongitude 
on t_assettAsset.id = latitudeLongitude.asset_id
0 голосов
/ 05 июня 2018

Если вы пытаетесь вернуть несколько значений одновременно, вам лучше объявить хранимую процедуру, а не функцию.Тогда вы сможете написать select latitude, longitude from ... внутри вашей процедуры и затем вызвать ее с помощью команды, подобной call getLatAndLong(...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...