Подскажите как можно сделать вложенный запрос в сыром запросе Код (Text): DB::connection('sqlsrv_system_center')->select("select ... from ... where ... ") так работает а теперь из этого запроса надо сделать SELECT DISTINCT и GROUP BY
Прям и дистинкт и группы бай? Масло масляное. Не мог бы ты изложить суть задачи, а не то, как ты думаешь её решить. Подозреваю, что ты знаком не с сиквельным груп-баем, а с тем как работает одноименная команда коллекций. Это блятт две большие разницы. --- Добавлено --- Если создашь песочницу на sqlfeedle, будет вообще шоколадно.
вот исходный запрос Код (Text): SELECT DISTINCT Display_Name, Publisher, Product_ID FROM (SELECT [v_GS_COMPUTER_SYSTEM].Name0 AS Computer_System_Name, [v_GS_OPERATING_SYSTEM].Name0 AS Operating_System_Name, [v_GS_COMPUTER_SYSTEM].UserName0 AS Computer_System_User_Name, [v_GS_OPERATING_SYSTEM].CSDVersion0 AS CSDVersion, [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 AS IP_Address, [v_GS_NETWORK_ADAPTER_CONFIGUR].MACAddress0 AS MAC_Address, [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 AS Display_Name, [v_GS_WORKSTATION_STATUS].LastHWScan AS Last_Hardware_Scan, [v_GS_ADD_REMOVE_PROGRAMS].Publisher0 AS Publisher, [v_GS_ADD_REMOVE_PROGRAMS].ProdID0 AS Product_ID, [v_GS_ADD_REMOVE_PROGRAMS].Version0 AS Versions FROM v_R_System inner join [v_GS_COMPUTER_SYSTEM] ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID inner join [v_GS_NETWORK_ADAPTER_CONFIGUR] ON v_GS_NETWORK_ADAPTER_CONFIGUR.ResourceID = v_R_System.ResourceID inner join [v_GS_ADD_REMOVE_PROGRAMS] ON v_GS_ADD_REMOVE_PROGRAMS.ResourceID = v_R_System.ResourceID inner join [v_GS_OPERATING_SYSTEM] ON v_GS_OPERATING_SYSTEM.ResourceID = v_R_System.ResourceID inner join [v_GS_WORKSTATION_STATUS] ON v_GS_WORKSTATION_STATUS.ResourceID = v_R_System.ResourceID WHERE [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.33.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.62.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.34.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.5.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.70.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.134.%' or [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.139.%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Пакет исправлений%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Windows XP Hotfix%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Security Update%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Update for Windows%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Исправление для Windows%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Обновление безопасности%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Пакет исправлений для Windows%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Hotfix for Windows%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Windows Installer%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Обновление для Windows%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Исправление для проигрывателя%' and [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'MSXML%' ) AS Mapping GROUP BY Display_Name, Publisher, Product_ID до этого я делал его частями , например : Код (Text): public static function getList() { return DB::connection('sqlsrv_system_center') ->table('v_R_SYSTEM') ->join('v_GS_ADD_REMOVE_PROGRAMS', function($join){ $join->on('v_R_SYSTEM.ResourceID', '=', 'v_GS_ADD_REMOVE_PROGRAMS.ResourceID') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Пакет исправлений%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Windows XP Hotfix%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Security Update%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Update for Windows%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Исправление для Windows%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Обновление безопасности%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Пакет исправлений для Windows%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Hotfix for Windows%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Windows Installer%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Обновление для Windows%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Исправление для проигрывателя%') ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'MSXML%'); }) ->select('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0','v_GS_ADD_REMOVE_PROGRAMS.Publisher0', 'v_GS_ADD_REMOVE_PROGRAMS.ProdID0') ->groupBy('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0','v_GS_ADD_REMOVE_PROGRAMS.Publisher0', 'v_GS_ADD_REMOVE_PROGRAMS.ProdID0') ->get(); } как сделать его в таком же варианте исполнения и не понял а времени не так много поэтому хочу спросить как сделать сырым как сделать песочницу я не знаю --- Добавлено --- буду благодарен за любую помощь, ps я еще только учусь
Group by гарантирует что перечисленные в нем поля будут уникальны. То есть каждая комбинация значений будет упоминаться не более одного раза - так же как и distinct. Поэтому использовать их вместе в таком виде нет смысла! --- Добавлено --- Достаточно оставить одно из двух. Поэтому я спросил: а чего же ты добиваешься в итоге? --- Добавлено --- Если тебя устраивало что получается на выходе query builder, то ты можешь подсмотреть какой SQL запрос он генерирует. Ты же понимаешь, что он по-любому выполняет "сырой запрос" Если вместо get() вызвать toSql(), получишь текст запроса
@artoodetoo я проковырялся с toSql и никак не могу получить то, что мне нужно. Я разобрался с sqlfeedle (правда потратил несколько часов т.к. нет прав на базу и пришлось набирать руками, если и есть другой способ, то я его не знаю), но не могу никак разобраться со вложенными запросами и с count. Не могли бы вы меня направить (не послать ) на правильный путь и объяснить, что я не правильно делаю?
Я не могу никуда направить пока нет четкого описания цели и нет иходных данных для тестовых прогонов. Что надо то? Только не говори "надо вложенный запрос". Что есть и что должно быть на выходе?
Сегодня я таки добился результата выношу на суд прошу объяснить мне что именно у меня не правильно или как сделать наиболее правильно, потому, что это в принципе первый мой опыт костылирования PHP: <?php namespace App; use App; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Model; class SystemCenter extends Model { public static function getList() { $query = DB::connection('sqlsrv_system_center')->table(DB::raw("(select v_GS_COMPUTER_SYSTEM.Name0 as Name, v_GS_OPERATING_SYSTEM.Name0, v_GS_COMPUTER_SYSTEM.UserName0, v_GS_OPERATING_SYSTEM.CSDVersion0, v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0, v_GS_NETWORK_ADAPTER_CONFIGUR.MACAddress0, v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 as DisplayName, v_GS_WORKSTATION_STATUS.LastHWScan, v_GS_ADD_REMOVE_PROGRAMS.Publisher0 as Publisher, v_GS_ADD_REMOVE_PROGRAMS.ProdID0 as ProdID, v_GS_ADD_REMOVE_PROGRAMS.Version0 from v_R_System inner join v_GS_COMPUTER_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID inner join v_GS_NETWORK_ADAPTER_CONFIGUR ON v_GS_NETWORK_ADAPTER_CONFIGUR.ResourceID = v_R_System.ResourceID inner join v_GS_ADD_REMOVE_PROGRAMS ON v_GS_ADD_REMOVE_PROGRAMS.ResourceID = v_R_System.ResourceID inner join v_GS_OPERATING_SYSTEM ON v_GS_OPERATING_SYSTEM.ResourceID = v_R_System.ResourceID inner join v_GS_WORKSTATION_STATUS ON v_GS_WORKSTATION_STATUS.ResourceID = v_R_System.ResourceID where v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.33.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.62.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.34.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.5.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.70.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.134.%' or v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.139.%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Пакет исправлений%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Windows XP Hotfix%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Security Update%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Update for Windows%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Исправление для Windows%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Обновление безопасности%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Пакет исправлений для Windows%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Hotfix for Windows%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Windows Installer%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Обновление для Windows%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Исправление для проигрывателя%' and v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'MSXML%') AS res"))->select('DisplayName', 'Publisher','ProdID')->groupBy('DisplayName', 'ProdID','Publisher')->addSelect(DB::raw("COUNT('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0') as total"))->get(); dd($query); } } вот ссылка на sqlfiddle - http://sqlfiddle.com/#!18/90b62/3 правда тут ограничение на 8000 не знал; собственно прошу разобрать мою работу и объяснить что не так. Благодарю за помощь всех кто помогал и будет помогать дальше --- Добавлено --- на выходе я получаю количество схлопываний по 3 уникальным столбцам я даже объяснить толком не могу другими словами если из 10000 записей трям трям трям встречалась 12 раз то у меня выходит трям трям трям 12
Запрос, конечно, трындец, с этими лайками,но, я так понимаю, архитектурой базы не вы занимались, и видимо, по-другому это не решить
да базой занимался не я , единственно я создал свою базу на нашем сервере (пока на тестовом) и пишу результат к себе если у меня еще нет таких записей. тут отдельная история, но эта часть у меня работает. у меня только один вопрос по поводу того, могу ли я каким нибудь сделать так, чтобы пользователь мог добавлять эти лайки если появятся новые? и стоит ли это делать мне кажется я еще больше пропаду...
Ну для того, чтобы ответить, надо понять, что это сооружение должно делать --- Добавлено --- v_GS_ADD_REMOVE_PROGRAMS - тут же есть какой-нибудь id-шник, нельзя ли получать заранее нужные id и проверять их not in, а не not like-ом по именам?
@mkramer я завтра посмотрю. у меня была мысль сделать отдельную таблицу со списком значений, т.е. пользователь добавлял бы значение и его через запрос подтягивало бы к основному запросу. Но пока для меня и это если честно подвиг, так что посмотрю завтра напишу.