Добрый день в SSMS написал такой запрос с двумя id: Код (Text): SELECT id, date FROM (SELECT TOP(1) RR.Asset AS id, RF.Date AS date FROM database1 AS RF LEFT JOIN database2 AS RR ON (RF.Reader = RR.Oid) WHERE RR.Asset = '93e8fecb-8782-4357-b0fc-75c147594f50' ORDER BY RF.Date desc) AS a UNION ALL SELECT id, date FROM (SELECT TOP(1) RR.Asset AS id, RF.Date AS date FROM database1 AS RF LEFT JOIN database2 AS RR ON (RF.Reader = RR.Oid) WHERE RR.Asset = 'b8bbc8b6-f36f-434f-9574-91cdaf1e708d' ORDER BY RF.Date desc) AS b Теперь переношу его в yii2 чтобы циклом проходилось по массиву c id, дошел до этого. Пока без цикла, вручную: PHP: $query = new Query; $id = ModelConnection::id(); $subQuery = (new Query()) ->select('RR.Asset AS id, RF.Date AS date') ->from('database1 AS RF') ->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid') ->limit(1) ->where(['RR.Asset' => $oid[0]]) ->orderBy(['RF.Date' => SORT_DESC]); $subQuery1 = (new Query()) ->select('RR.Asset AS id, RF.Date AS date') ->from('database1 AS RF') ->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid') ->limit(1) ->where(['RR.Asset' => $oid[1]]) ->orderBy(['RF.Date' => SORT_DESC]); $query->select('id, date'); $query->from(['a' => $subQuery->union($subQuery1)]); $result = $query->all(); if(count($result) > 0){ return $result; } Подскажите как это грамотно засунуть в цикл, особенно интересует UNION, логика его примерно такая: $subQuery->union($subQuery1)->union($subQuery2)->union($subQuery3) и т.п.
пока написал так: PHP: $query->select('id, date'); foreach($oid as $key => $val){ $sql = (new Query()) ->select('RR.Asset AS id, RF.Date AS date') ->from('EAM_test.dbo.RFIDData AS RF') ->leftjoin('EAM_test.dbo.RFIDReader AS RR', 'RF.Reader = RR.Oid') ->limit(1) ->where(['RR.Asset' => $val]) ->orderBy(['RF.Date' => SORT_DESC]); $subQuery[$key] = $sql; } $query->from([$subQuery[0]->union($subQuery[1])->union($subQuery[2])]); $result = $query->all(); Может кто сталкивался как можно union в цикле вывести?
Написал вот такой костыль, может кто знает как без него? PHP: $query->select('id, date'); foreach($oid as $key => $val){ $subQuery[$key] = (new Query()) ->select('RR.Asset AS id, RF.Date AS date') ->from('database1 AS RF') ->leftjoin('database2 AS RR', 'RF.Reader = RR.Oid') ->limit(1) ->where(['RR.Asset' => $val]) ->orderBy(['RF.Date' => SORT_DESC]); } if(count($oid) === 1){ $query->from([$subQuery[0]]); } if(count($oid) === 2){ $query->from([$subQuery[0]->union($subQuery[1])]); } if(count($oid) === 3){ $query->from([$subQuery[0]->union($subQuery[1])->union($subQuery[2])]); } $result = $query->all(); if(count($result) > 0){ return $result; }
@Artur_hopf, попробуй так: PHP: $subQuery = false; foreach($oid as $key => $val){ $sql = (new Query()) ->select('RR.Asset AS id, RF.Date AS date') ->from('EAM_test.dbo.RFIDData AS RF') ->leftjoin('EAM_test.dbo.RFIDReader AS RR', 'RF.Reader = RR.Oid') ->limit(1) ->where(['RR.Asset' => $val]) ->orderBy(['RF.Date' => SORT_DESC]); if($subQuery === false) { $subQuery = $sql; } else { $subQuery = $subQuery->union($sql); } } if($subQuery !== false) { $query->select('id, date')->from($subQuery); $result = $query->all(); } else { // ... }
@Sail не, так не получится. sql будет равен последнему запросу. Даже если сделать $sql[$key] непонятно как в union такой массив передать.
Попробуйте, посмотрите, какой запрос подготовит предложенный вариант. Если действительно необходимо использовать $sql[$key], то допишите перед циклом инициализацию ($sql = []), а в цикле вместо $sql - $sql[$key]. Основная идея в том, как формируется $subQuery.
@Sail там основная идея в том чтобы написать так =) : PHP: $query->select('id, date'); $query->union($subQuery); $result=$query->all(); И все, но у меня $subQuery массив и так не прокатит наверное.