За последние 24 часа нас посетили 17957 программистов и 1582 робота. Сейчас ищут 1208 программистов ...

Сырые запросы

Тема в разделе "Laravel", создана пользователем Feonix89, 2 июл 2018.

  1. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Подскажите как можно сделать вложенный запрос в сыром запросе :)
    Код (Text):
    1. DB::connection('sqlsrv_system_center')->select("select ... from ... where ... ") так работает а теперь из этого запроса надо сделать SELECT DISTINCT и GROUP BY
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Прям и дистинкт и группы бай? Масло масляное.
    Не мог бы ты изложить суть задачи, а не то, как ты думаешь её решить.

    Подозреваю, что ты знаком не с сиквельным груп-баем, а с тем как работает одноименная команда коллекций. Это блятт две большие разницы.
    --- Добавлено ---
    Если создашь песочницу на sqlfeedle, будет вообще шоколадно.
     
  3. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    вот исходный запрос
    Код (Text):
    1. SELECT DISTINCT Display_Name,
    2.                 Publisher,
    3.                 Product_ID
    4. FROM
    5.     (SELECT
    6.         [v_GS_COMPUTER_SYSTEM].Name0 AS Computer_System_Name,
    7.         [v_GS_OPERATING_SYSTEM].Name0 AS Operating_System_Name,
    8.         [v_GS_COMPUTER_SYSTEM].UserName0 AS Computer_System_User_Name,
    9.         [v_GS_OPERATING_SYSTEM].CSDVersion0    AS CSDVersion,
    10.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 AS IP_Address,
    11.         [v_GS_NETWORK_ADAPTER_CONFIGUR].MACAddress0 AS MAC_Address,
    12.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 AS Display_Name,
    13.         [v_GS_WORKSTATION_STATUS].LastHWScan AS Last_Hardware_Scan,
    14.         [v_GS_ADD_REMOVE_PROGRAMS].Publisher0  AS Publisher,
    15.         [v_GS_ADD_REMOVE_PROGRAMS].ProdID0 AS Product_ID,
    16.         [v_GS_ADD_REMOVE_PROGRAMS].Version0 AS Versions
    17.    
    18.     FROM v_R_System
    19.         inner join [v_GS_COMPUTER_SYSTEM] ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID
    20.         inner join [v_GS_NETWORK_ADAPTER_CONFIGUR] ON v_GS_NETWORK_ADAPTER_CONFIGUR.ResourceID = v_R_System.ResourceID
    21.         inner join [v_GS_ADD_REMOVE_PROGRAMS] ON v_GS_ADD_REMOVE_PROGRAMS.ResourceID = v_R_System.ResourceID
    22.         inner join [v_GS_OPERATING_SYSTEM] ON v_GS_OPERATING_SYSTEM.ResourceID = v_R_System.ResourceID
    23.         inner join [v_GS_WORKSTATION_STATUS] ON v_GS_WORKSTATION_STATUS.ResourceID = v_R_System.ResourceID
    24.  
    25.     WHERE
    26.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.33.%' or
    27.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.62.%' or
    28.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.34.%' or
    29.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.5.%' or
    30.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.70.%' or
    31.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.134.%' or
    32.         [v_GS_NETWORK_ADAPTER_CONFIGUR].IPAddress0 LIKE '10.233.139.%' and
    33.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Пакет исправлений%' and
    34.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Windows XP Hotfix%' and
    35.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Security Update%' and
    36.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Update for Windows%' and
    37.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Исправление для Windows%' and
    38.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Обновление безопасности%' and
    39.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Пакет исправлений для Windows%' and
    40.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Hotfix for Windows%' and
    41.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Windows Installer%' and
    42.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Обновление для Windows%' and
    43.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'Исправление для проигрывателя%' and
    44.         [v_GS_ADD_REMOVE_PROGRAMS].DisplayName0 NOT LIKE 'MSXML%'
    45.     ) AS Mapping
    46.  
    47. GROUP BY Display_Name,
    48.          Publisher,
    49.          Product_ID
    до этого я делал его частями , например :
    Код (Text):
    1. public static function getList()
    2.     {
    3.         return DB::connection('sqlsrv_system_center')
    4.             ->table('v_R_SYSTEM')
    5.             ->join('v_GS_ADD_REMOVE_PROGRAMS', function($join){
    6.                 $join->on('v_R_SYSTEM.ResourceID', '=', 'v_GS_ADD_REMOVE_PROGRAMS.ResourceID')
    7.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Пакет исправлений%')
    8.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Windows XP Hotfix%')
    9.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Security Update%')
    10.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Update for Windows%')
    11.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Исправление для Windows%')
    12.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Обновление безопасности%')
    13.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Пакет исправлений для Windows%')
    14.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Hotfix for Windows%')
    15.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Windows Installer%')
    16.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Обновление для Windows%')
    17.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'Исправление для проигрывателя%')
    18.                     ->where('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0', 'not like', 'MSXML%');
    19.                 })    
    20.             ->select('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0','v_GS_ADD_REMOVE_PROGRAMS.Publisher0', 'v_GS_ADD_REMOVE_PROGRAMS.ProdID0')
    21.             ->groupBy('v_GS_ADD_REMOVE_PROGRAMS.DisplayName0','v_GS_ADD_REMOVE_PROGRAMS.Publisher0', 'v_GS_ADD_REMOVE_PROGRAMS.ProdID0')
    22.             ->get();
    23.     }
    как сделать его в таком же варианте исполнения и не понял а времени не так много
    поэтому хочу спросить как сделать сырым
    как сделать песочницу я не знаю :(
    --- Добавлено ---
    буду благодарен за любую помощь, ps я еще только учусь
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Group by гарантирует что перечисленные в нем поля будут уникальны. То есть каждая комбинация значений будет упоминаться не более одного раза - так же как и distinct. Поэтому использовать их вместе в таком виде нет смысла!
    --- Добавлено ---
    Достаточно оставить одно из двух.

    Поэтому я спросил: а чего же ты добиваешься в итоге?
    --- Добавлено ---
    Если тебя устраивало что получается на выходе query builder, то ты можешь подсмотреть какой SQL запрос он генерирует. Ты же понимаешь, что он по-любому выполняет "сырой запрос" :)
    Если вместо get() вызвать toSql(), получишь текст запроса ;)
     
    Feonix89 нравится это.
  5. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    спасибо огромное, попробую я этого не знал и как слепой котенок ....
     
  6. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    @artoodetoo я проковырялся с toSql и никак не могу получить то, что мне нужно.
    Я разобрался с sqlfeedle (правда потратил несколько часов т.к. нет прав на базу и пришлось набирать руками, если и есть другой способ, то я его не знаю), но не могу никак разобраться со вложенными запросами и с count.
    Не могли бы вы меня направить (не послать :) ) на правильный путь и объяснить, что я не правильно делаю?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Я не могу никуда направить пока нет четкого описания цели и нет иходных данных для тестовых прогонов. :)
    Что надо то? Только не говори "надо вложенный запрос". Что есть и что должно быть на выходе?
     
  8. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Сегодня я таки добился результата :) выношу на суд :) прошу объяснить мне что именно у меня не правильно или как сделать наиболее правильно, потому, что это в принципе первый мой опыт костылирования :)

    PHP:
    1. <?php
    2.  
    3. namespace App;
    4.  
    5. use App;
    6. use Illuminate\Http\Request;
    7. use Illuminate\Support\Facades\DB;
    8. use Illuminate\Database\Eloquent\Model;
    9.  
    10.  
    11. class SystemCenter extends Model
    12. {
    13.     public static function getList()
    14.     {
    15.  
    16.  
    17.     $query = DB::connection('sqlsrv_system_center')->table(DB::raw("(select
    18.    v_GS_COMPUTER_SYSTEM.Name0 as Name,
    19.    v_GS_OPERATING_SYSTEM.Name0,
    20.    v_GS_COMPUTER_SYSTEM.UserName0,
    21.    v_GS_OPERATING_SYSTEM.CSDVersion0,
    22.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0,
    23.    v_GS_NETWORK_ADAPTER_CONFIGUR.MACAddress0,
    24.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 as DisplayName,
    25.    v_GS_WORKSTATION_STATUS.LastHWScan,
    26.    v_GS_ADD_REMOVE_PROGRAMS.Publisher0 as Publisher,
    27.    v_GS_ADD_REMOVE_PROGRAMS.ProdID0 as ProdID,
    28.    v_GS_ADD_REMOVE_PROGRAMS.Version0
    29.    from v_R_System
    30.    inner join v_GS_COMPUTER_SYSTEM ON v_GS_COMPUTER_SYSTEM.ResourceID = v_R_System.ResourceID
    31.    inner join v_GS_NETWORK_ADAPTER_CONFIGUR ON v_GS_NETWORK_ADAPTER_CONFIGUR.ResourceID = v_R_System.ResourceID
    32.    inner join v_GS_ADD_REMOVE_PROGRAMS ON v_GS_ADD_REMOVE_PROGRAMS.ResourceID = v_R_System.ResourceID
    33.    inner join v_GS_OPERATING_SYSTEM ON v_GS_OPERATING_SYSTEM.ResourceID = v_R_System.ResourceID
    34.    inner join v_GS_WORKSTATION_STATUS ON v_GS_WORKSTATION_STATUS.ResourceID = v_R_System.ResourceID
    35.    where
    36.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.33.%' or
    37.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.62.%' or
    38.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.34.%' or
    39.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.5.%' or
    40.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.70.%' or
    41.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.134.%' or
    42.    v_GS_NETWORK_ADAPTER_CONFIGUR.IPAddress0 LIKE '10.233.139.%' and
    43.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Пакет исправлений%' and
    44.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Windows XP Hotfix%' and
    45.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Security Update%' and
    46.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Update for Windows%' and
    47.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Исправление для Windows%' and
    48.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Обновление безопасности%' and
    49.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Пакет исправлений для Windows%' and
    50.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Hotfix for Windows%' and
    51.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Windows Installer%' and
    52.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Обновление для Windows%' and
    53.    v_GS_ADD_REMOVE_PROGRAMS.DisplayName0 NOT LIKE 'Исправление для проигрывателя%' and
    54.    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();
    55.  
    56.     dd($query);
    57.     }
    58. }
    вот ссылка на sqlfiddle - http://sqlfiddle.com/#!18/90b62/3 правда тут ограничение на 8000 не знал;

    собственно прошу разобрать мою работу и объяснить что не так. Благодарю за помощь всех кто помогал и будет помогать дальше :)
    --- Добавлено ---
    на выходе я получаю количество схлопываний по 3 уникальным столбцам я даже объяснить толком не могу
    другими словами если из 10000 записей трям трям трям встречалась 12 раз то у меня выходит трям трям трям 12
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Запрос, конечно, трындец, с этими лайками,но, я так понимаю, архитектурой базы не вы занимались, и видимо, по-другому это не решить
     
  10. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    да базой занимался не я , единственно я создал свою базу на нашем сервере (пока на тестовом) и пишу результат к себе если у меня еще нет таких записей. тут отдельная история, но эта часть у меня работает.
    у меня только один вопрос по поводу того, могу ли я каким нибудь сделать так, чтобы пользователь мог добавлять эти лайки если появятся новые? и стоит ли это делать мне кажется я еще больше пропаду...
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну для того, чтобы ответить, надо понять, что это сооружение должно делать
    --- Добавлено ---
    v_GS_ADD_REMOVE_PROGRAMS - тут же есть какой-нибудь id-шник, нельзя ли получать заранее нужные id и проверять их not in, а не not like-ом по именам?
     
  12. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    @mkramer я завтра посмотрю. у меня была мысль сделать отдельную таблицу со списком значений, т.е. пользователь добавлял бы значение и его через запрос подтягивало бы к основному запросу. Но пока для меня и это если честно подвиг, так что посмотрю завтра напишу.