MySQL subView z użyciem funkcji

No więc tak, dziś miałem mały problem jak zrobić taki myk iż, mam sobie view MySQL’a który pobiera mi pewne informację z tabel, ale chce aby idealnie pasująca fraza była jako pierwsza. W 90% przypadków użytkownik wpisywał wartość jednego pola i to ono miało być jako pierwsze. Widok prezentuje się następująco:

CREATE
    ALGORITHM = UNDEFINED
    DEFINER = `localhost`@`%`
    SQL SECURITY DEFINER
VIEW `view_mzk_ins_wezwania` AS
    select
        `acc_mzk_wezwania`.`wez_Id` AS `wez_Id`,
        `acc_mzk_wezwania`.`wez_Numer` AS `wez_Numer`,
        `acc_mzk_wezwania`.`wez_DataWystawienia` AS `wez_DataWystawienia`,
        `acc_mzk_autobus`.`bus_NumerBoczny` AS `bus_NumerBoczny`,
        `acc_mzk_kontroler`.`kon_Identyfikator` AS `kon_Identyfikator`,
        `acc_mzk_linie`.`aml_Numer` AS `aml_Numer`,
        `acc_mzk_klient`.`kh_Imie` AS `kh_Imie`,
        `acc_mzk_klient`.`kh_Nazwisko` AS `kh_Nazwisko`,
        `acc_mzk_klient`.`kh_Adres_Podst` AS `kh_Adres_Podst`,
        `acc_mzk_klient`.`kh_Miasto_Podst` AS `kh_Miasto_Podst`,
        `acc_mzk_klient`.`kh_Kod_Podst` AS `kh_Kod_Podst`,
        `acc_mzk_klient`.`kh_PESEL` AS `kh_PESEL`,
        `acc_mzk_klient`.`kh_NrDowodu` AS `kh_NrDowodu`,
        cast(concat_ws(' ',
                    convert( `acc_mzk_wezwania`.`wez_Numer` using utf8),
                    convert( `acc_mzk_wezwania`.`wez_DataWystawienia` using utf8),
                    `acc_mzk_autobus`.`bus_NumerBoczny`,
                    `acc_mzk_linie`.`aml_Numer`,
                    `acc_mzk_kontroler`.`kon_Imie`,
                    `acc_mzk_kontroler`.`kon_Nazwisko`,
                    `acc_mzk_kontroler`.`kon_Identyfikator`,
                    `acc_mzk_klient`.`kh_Imie`,
                    `acc_mzk_klient`.`kh_Nazwisko`,
                    `acc_mzk_klient`.`kh_Adres_Podst`,
                    `acc_mzk_klient`.`kh_Miasto_Podst`,
                    `acc_mzk_klient`.`kh_Kod_Podst`,
                    `acc_mzk_klient`.`kh_PESEL`,
                    `acc_mzk_klient`.`kh_NrDowodu`)
            as char charset utf8) AS `dane_instynkt`
    from
        ((((`acc_mzk_wezwania`
        left join `acc_mzk_autobus` ON ((`acc_mzk_wezwania`.`wez_AutobusId` = `acc_mzk_autobus`.`bus_Id`)))
        left join `acc_mzk_kontroler` ON ((`acc_mzk_wezwania`.`wez_KontrolerId` = `acc_mzk_kontroler`.`kon_Id`)))
        left join `acc_mzk_linie` ON ((`acc_mzk_wezwania`.`wez_Linia` = `acc_mzk_linie`.`aml_Id`)))
        left join `acc_mzk_klient` ON ((`acc_mzk_wezwania`.`wez_KhId` = `acc_mzk_klient`.`kh_Id`)))s

I teraz chciałbym żeby najpierw był wyświetlany rekord który idealnie pasuje do pola wez_Numer i dopiero później rekordy które pasują do dane_instynkt.

Rozwiązałem to w następujący sposób. Stworzyłem funkcję która zwraca przypisany do niej parametr:

create function param1() returns INTEGER DETERMINISTIC NO SQL return @param1;

Następnie stworzyłem nowy widok który stosuje moje ‚chciejstwo’ i najpierw szuka idealnie pasującego rekordu a dopiero później dokleja do tego kolejne pasujące rekordy:

create view view_mzk_wezwania_instynkt as
SELECT * FROM localhost.view_mzk_ins_wezwania WHERE wez_Numer = param1()
UNION
SELECT * FROM localhost.view_mzk_ins_wezwania WHERE dane_instynkt LIKE concat('%', convert( param1() using utf8), '%');

Wywołuje teraz zapytanie w następujący sposób i otrzymuje dokładnie to czego oczekuję:

select s.* from (select @param1:=9004 p) parm , view_mzk_wezwania_instynkt s;

Kasztelan Paweł

Programista samouk, zakochany w ZF i Laravel, szerzący opinię że PHP + JS + HTML + CSS to są języki w których może zostać stworzona aplikacja równie dobra, a nawet lepsza od twardego klienta.

  • Piotr Jaczewski

    hej, a co powiesz na dodanie do pierwszego widoku klauzuli Order By z IF’em ?

    select * from view
    where
    wez_Numer = ‚PARMAETR’ or dane_instynkt LIKE concat(‚%’, CONVERT( param1() USING utf8), ‚%’);

    Order by if(wez_Numer = ‚PARMAETR’, 1, 0) asc