[MYSQL] Pytanie dot. sposobu "formowania" zapytań

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

[MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

Witam.

Właśnie jestem w trakcie pisania programu do katalogowania części elektronicznych (dla mojego użytku, póki co nie zamierzam dzielić się pracą bo mało jej ;) ) i mam pewnego rodzaju "dylemat" jeżeli chodzi o sformowanie zapytania do bazy... ale do rzeczy

Mam kilka tablic
Elementy (ID, Nazwa, ID_grupy)
Wartości (ID, wartość)
Grupy (ID, NazwaGrupy, ID_parametru)
Parametry (ID, Nazwa, Jednostka)
Powiązania między grupami i parametrami
Powiązania między elementami i wartościami

(kilka słów komentarza dlaczego tak to wymyśliłem, jak już powiedziałem zamierzam stworzyć bazę z elementami elektronicznymi a one mają to do siebie że każdy z nich ma inne parametry (rodzaje) więc nie mogłem przypisać na stałe parametrów do elementu. Oraz, dane grupy elementów np. "rezystory drutowe" mają taką samą listę parametrów, z tąd też przypisuję parametry do grupy, a nie do elementu)

I teraz chcę wyświetlić... Nazwę elementu, wszystkie jego parametry i wartości tych parametrów do tej pory zrobiłem 3 procedury wyświetlające mi 3 tabele z odpowiednio
nazwami elementów z danej grupy
rodzajami parametrów
I wartościami tych parametrów (jako war_parametru1, war_par2, war_par3, war_par1 itd...)
Program do zarządzania pisze w QT więc nie będę miał problemu z wyświetlaniem tego jeśli jest to w takiej postaci. Więc póki co wszystko jest cacy :) Ale teraz w przypadku kiedy będę chciał filtrować elementy (np. rezystory tylko na wielkie R ;) ) już mi się robi sieczka, bo za jeszcze jak lista parametrów mi się nie zmienia tak już ich ilość (i co lepsze) kolejność (bo mogę również sortować) się zmienia...

Czy ktoś ma pomysł jak w miarę prosty sposób zrealizować takie zapytanie? spróbować zapisać wyszukiwanie nazw elementów i parametrów w jednym zapytaniu,, czy jakoś inaczej?

Pozdrawiam zawisza

Poniżej zamieszczam kod moim procedur :) jak ktoś ma jakieś uwagi co do procedur to chętnie posłucham, domyślam się że to co napisałem to pewnie straszny syf ;)

Kod: Zaznacz cały

CREATE DEFINER=`root`@`%` PROCEDURE `getElementsNames`(IN cat_name VARCHAR(45), IN level INT)
BEGIN
 SELECT idelementy, nazwa_elementu FROM `test`.`elementy` WHERE `elementy`.`id_grupy`= (SELECT idgrupy FROM `test`.`grupy` WHERE `test`.`grupy`.`grupy_nazwa` = cat_name AND  `test`.`grupy`.`grupy_level` = level); 
END

CREATE DEFINER=`root`@`%` PROCEDURE `getParametersList`(IN cat_name VARCHAR(45), IN level INT )
BEGIN
    SELECT nazwa_parametru, jednostka FROM test.parametry 
    WHERE test.parametry.idparametry IN (SELECT parametr_ID FROM test.wiazania_parametryGrupa  WHERE grupa_ID = (SELECT idgrupy FROM test.grupy WHERE test.grupy.grupy_nazwa = cat_name AND test.grupy.grupy_level = level) );

END

CREATE DEFINER=`root`@`%` PROCEDURE `getParametersValues`(IN cat_name VARCHAR(45), IN level INT)
BEGIN
    SELECT wartosci FROM test.wartosci  
    WHERE test.wartosci.idwartosci IN ( SELECT ID_wartosci FROM test.wiazanie_elementyWartosci
        WHERE ID_elementu IN (SELECT idelementy FROM test.elementy 
            WHERE (test.elementy.id_grupy = ( SELECT idgrupy FROM test.grupy 
                WHERE grupy_nazwa = cat_name AND grupy_level = level )
            )
        )
    );

END
Awatar użytkownika
rob006
Wytworny Kaczor
Wytworny Kaczor
Posty: 417
Rejestracja: 28 paź 2007, 23:11
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Lublin
Kontakt:

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: rob006 »

Niewiele zrozumiałem z opisu, ale po zerknięciu na zapytania, w oczy rzucają się 2 rzeczy:
1. Po co te procedury? Przecież one wykonują tylko zwykłe zapytania. Zapytań nie musisz zamykać w procedury, wystarczy je wysłać tak jak są. Ewentualnie jeśli chcesz mieć to w bazie, lepiej wykorzystać widoki - dużo wygodniejsze i bardziej elastyczne rozwiązanie.
2. Podzapytania są nie tylko mniej elastyczne, ale też duuuuużo mniej wydajne niż złączenia. I podejrzewam że właśnie tu leży twój problem. Link: http://sephiro.boo.pl/index.php/2012/07 ... sql-joins/
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

Spróbuje to wytłumaczyć jaśniej :)

jak już wcześniej pisałem
Mam kilka tablic
* Elementy (ID, Nazwa, ID_grupy) W tej tablicy zapisywany jest każdy element, posiada on nazwę i grupę do której należy
* Wartości (ID, wartość) W tej tablicy zapisywane są same WARTOŚCI PARAMETRÓW czyli np
* Grupy (ID, NazwaGrupy, ID_parametru) Nic ciekawego, tak naprawdę zastanawiam się czy ID_parametru jest mi tutaj potrzebne
* Parametry (ID, Nazwa, Jednostka) W tej tablicy zapisuję wszystkie parametry jak np. Ilość timerów w µC czy rezystancja dławika
* Powiązania między grupami i parametrami Tutaj chcę zapisać powiązanie pomiędzy grupą a parametrami czyli np. rezystory mają parametry R, P a kondensatory C i np "typ dielektryka"
* Powiązania między elementami i wartościami, w tej tablicy chcę mieć powiązanie elementy wartości czyli rezystor, parametr R = 100, parametr P = 1/4

I chciałem napisać zapytanie które na podstawie nazwy grupy wymierało elementy wraz z parametrami i wartościami.

Kod: Zaznacz cały

SELECT *  FROM test.elementy 
    INNER JOIN wiazanie_elementyWartosci ON test.elementy.idelementy = test.wiazanie_elementyWartosci.ID_elementu
    INNER JOIN wartosci ON test.wiazanie_elementyWartosci.ID_wartosci = wartosci.idwartosci
    INNER JOIN parametry ON id_parametru = idparametry

WHERE id_grupy = (SELECT idgrupy FROM grupy WHERE grupy_nazwa = "NAZWA" )
To zapytanie robi mniej więcej to samo, ale jak ilość parametrów będzie inna dla poszczególnych elementów to już zacznie się robić niefajnie... nie wiem tylko czy to będzie jakimś problemem w przyszłości. Ale fajne jest to że odpada mi jedna tabela :) Może teraz, jak już mam nadzieję wytłumaczyłem to trochę lepiej, ktoś mi podpowie jak zrobić to inaczej lub czy ten sposób jest dobry

Pozdrawiam zawisza
Awatar użytkownika
rob006
Wytworny Kaczor
Wytworny Kaczor
Posty: 417
Rejestracja: 28 paź 2007, 23:11
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Lublin
Kontakt:

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: rob006 »

A możesz powiedzieć czemu ilość parametrów miałaby być problemem? Nie ustawiasz ich liczby statycznie, tylko przeglądasz rezultat zapytania i na tej podstawie określasz ich liczbę.
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

W tą stronę tak, ale gdybym chciał dodać parametr do kategorii, musiałbym do każdego elementu dopisać dodatkowe łączenie (dla każdego elementu nowy wpis w tabeli wiązań wartości z elementami) , a tak to tylko jedną linijkę do tabeli dodaje i spokój ;)
Ale z drugiej strony w takim układzie wcale nie muszę dodawać tego parametru do wszystkich elementów, wystarczy do jednego...

Dzięki za pomoc :)
A co do samego zapytania, czy jest tam coś co można by poprawić?
Awatar użytkownika
rob006
Wytworny Kaczor
Wytworny Kaczor
Posty: 417
Rejestracja: 28 paź 2007, 23:11
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Lublin
Kontakt:

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: rob006 »

Całkiem wywaliłbym tabelę pośrednią pomiędzy parametrami i ich wartościami. W wartościach można zawierać informację do którego parametru którego elementu należy.
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

Witam. :)

Teraz mam inne pytanie, aczkolwiek tej samej natury :) Mam już przygotowane potrzebne mi tabele i zapytania, ale do tej pory wpisywałem dane do tabeli ręcznie (dla testów). pytanie jak wpisać dane do takiej tabeli (właściwie to tabel) jak uformować zapytanie?
Bo z tego co wyczytałem INSERT może jednocześnie wpisać dane do 1 tabeli. więc mogę zrobić
INSERT ELEMENT (nazwa, id_grupy...) //wpisuję nowy el.
odczytaj i zapisz ID nowego elementu
INSERT WARTOŚCI (wartość) // dodaję jego wartości np. rezystancja, moc
odczytaj i zapisz id dodanych wartości
INSERT WIĄZANIA_WARTOŚĆ_ELEMENT (id_elementu, id_parametru, id_wartości) // tu zapisuje VALUES ( E, P1, W1),(X, P2, W2) gdzie E-> id_el, Px -> id_parametru_x, Wx->id_wartości

Ale ma to swoje wady, w czasie kiedy będę zapisywał element do tabeli, ktoś inny może robić to samo (nawet mnóstwo innych osób może robić to samo, może nie w moim przypadku, ale...) co jeśli zapiszę swój element, a odczytam ID elementu kogoś innego? (odczytywałbym ostatni ID, nie mogę np. wyszukać po nazwie gdyż nazwa nie jest jednoznaczna w tym przypadku) czy można się przed tym zabezpieczyć, czy trzeba wymyślić jakiś swój unikalny KOD produktu? :)

Ogólnie chciałbym się dowiedzieć jakie są sposoby przez zabezpieczaniem się w takich sytuacjach.

Pozdrawiam Zawisza

#########EDIT#############

Oraz jeszcze jedno, czy w momencie kiedy zapisuję dane do tabeli (pojedynczym insertem, wiele wierszy) to czy jest możliwe aby inny proces wbił mi się w zapis? Np zapisuję 100 wartości (ID, WARTOŚĆ) id jest automatycznie inkrementowane, to moje ID będzie na 100% ciągłe, czy może jest szansa aby inny proces w tym czasie wstawił tam swoje ID z danymi?

Pozdrawiam Zawisza
Ostatnio zmieniony 28 lip 2013, 08:13 przez cszawisza, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: ethanak »

Jeśli korzystasz z autoincrement, poprzez LAST_INSERT_ID() (czy php-owy wrapper) dostaniesz ID rekordu który wstawiłeś nawet jeśli w międzyczasie coś się zmieni.
Ogólnie: warto przed smędzeniem na forum zajrzeć do dokumentacji - akurat w przypadku MySQL kompletna dokumentacja jest dostępna zupełnie za darmo i nic nie stoi na przeszkodzie aby z niej skorzystać.
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

ethanak pisze:Jeśli korzystasz z autoincrement, poprzez LAST_INSERT_ID() (czy php-owy wrapper) dostaniesz ID rekordu który wstawiłeś nawet jeśli w międzyczasie coś się zmieni.
Ogólnie: warto przed smędzeniem na forum zajrzeć do dokumentacji - akurat w przypadku MySQL kompletna dokumentacja jest dostępna zupełnie za darmo i nic nie stoi na przeszkodzie aby z niej skorzystać.
czytałem dokumentację, czytałem o funkcji last_insert_id(), ale nie doczytałem że ta funkcja zwraca ID mojego zapytania, myślałem że ogólnie, ostatniego zapytania.
Co do czytanie dokumentacji, chętnie ją czytam, ale czasami informacji jest tak dużo że wyszukanie tej odpowiedniej jest po prostu bardzo czasochłonne, a czasem nie wiem nawet czego mam szukać (w tym przypadku czego? blokowania tabel, dostępu atomowego do tabeli, ogólnych sposobów na ominięcie problemu, specjalnej funkcji?) poza tym, jeśli da się to zrobić na kilka sposobów, to jak najlepiej? :) czasami trzeba słowa kluczowego i 2 słów wyjaśnienia, w dokumentacji nie pisze (zazwyczaj) o wadach takiego rozwiązania w przypadku jakiegoś konkretnego użycia... A takie informację da, ktoś kto z tym problemem się mierzył niejednokrotnie :)

Pozdrawiam Zawisza
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: ethanak »

cszawisza pisze: czytałem dokumentację, czytałem o funkcji last_insert_id(), ale nie doczytałem że ta funkcja zwraca ID mojego zapytania, myślałem że ogólnie, ostatniego zapytania.
dokumentacja pisze:The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions.
Fakt, że ze skróconego opisu przy CREATE TABLE nic takiego nie wynika, czyli mogłeś to przeoczyć. Ale akurat przy dokumentacji MySQL-a warto sobie kliknąć w link do dokładnego opisu (sam parę razy się nabrałem na szukanie naokoło) - chociaż ten link może być ukryty w bardzo dziwnych miejscach :)
cszawisza
Piegowaty Guziec
Piegowaty Guziec
Posty: 25
Rejestracja: 03 cze 2011, 23:51

Re: [MYSQL] Pytanie dot. sposobu "formowania" zapytań

Post autor: cszawisza »

OK walczyłem długo, ale niestety... :)

Chcę napisać procedurę która podczas jednego zapytania sprawdziłaby czy
1) dany element istnieje (Czy jest element o danej obudowie i nazwie w bieżącej grupie), jeśli istnieje sprawdzi jego parametry oraz zwróci ID_elementu jeśli go znajdzie oraz informację czy taki element jest w tabeli (funkcja checkItem)
2.a) Jeśli status =2 (element istnieje), zwiększy liczbę elementów w magazynie // to nie jest problemem
2.b) Jeśli status != 2(nie istnieje, lub ma inne parametry), doda element o podanych parametrach...// to już jest problemem :)

W przypadku sprawdzania czy element o danych parametrach istnieje, wysyłam do funkcji checkItem informację o elemencie oraz informację o parametrach w formie ID_Parametru;"Wartsc";;ID_Parametru;"Wartosc jako text. Sprawdza się to dobrze (jak to zrobiłem można zobaczyć w kodzie poniżej, ale teraz nie ma to większego znaczenia ;) ) szczególnie że ilość parametrów rzadko będzie przekraczać kilka, więc nie będzie to miało wpływu na wydajność.

Wykorzystując podobną technikę, chciałem napisać funkcję dodającą element wraz z wszystkimi potrzebnymi informacjami, dość szybko przekonałem się jednak że nie potrafię tego zrobić, a jeśli nawet udało by mi się to to napewno robię coś źle, bo jest to zbyt skomplikowane jak na takie proste zapytanie i napewno da się to zrobić lepiej... Chodzi dokładnie o ten

Kod: Zaznacz cały

    -- dodanie wiązanie pomiędzy parametrem o znanym ID z nowo wstawioną wartością
    -- INSERT INTO `test`.`wiazanie_elementyWartosci` (`id_parametru`, `ID_elementu`, `ID_wartosci`) VALUES (p, e , w);
                 
    SET @w = 1 ;
     WHILE @w < 3 DO

        SET @w = @w+1;
     END WHILE;

kawałek kodu w funkcji addItem, funkcja ta ma za zadanie.
Dodać element, zapisać jego ID, dodać wartości (to akurat było łatwe ;) ) zapisać ID ostatniej wartości i... dodać wiązania parametrów z wartościami...
To ostanie jest sporym problemem. Mam id_parametru (jest w zmiennej _parameters, zapisanej jak wyżej), mam ID elementu (dostaję po dodaniu nowego parametru), oraz mam ID_OSTATNIEJwartości. Znaczy to że w tym whil'u muszę zapisywać wiązania po kolei tworząc stringa w którym usuwam jedną wartość i zastępuje ją wartością ID_wartości pomniejszoną o "w"... to jest kompletnie bez sensu i nawet nie będę próbował tego tak robić... (nie chcę stosować żadnych funkcji które trzeba doinstalowywać jako zewnętrzne pakiety, być może kiedyś będę się przesiadał na inny serwer i będę miał problemy z przenośnością kodu)

A chcę zrobić to jedną procedurą ze względu na to że serwer SQL jest daleko ode mnie i i wykonywanie kilku zapytań zajmuje sporo czasu, samo dodanie elementu instrukcja po instrukcji zajmuje dobre 1.5s, jako 'ciekawostkę" dodam że wykonanie np. 1000 zapytań do bazy, przez 1 klienta trwa 100s, a wykonanie 1000 zapytań przez 20 klientów trwa... 100s :)
więc chcę zamknąć całość w procedurze i przesyłać tylko minimalną ilość danych.

Gdyby coś było nie zrozumiałe proszę pisać, postaram się wytłumaczyć :)

Jak ktoś ma pomysł jak wykonać takie zapytanie to proszę o podzielenie się informacją :)

Pozdrawiam Zawisza

Kod: Zaznacz cały

CREATE PROCEDURE `test`.`addItem` (
    IN _name VARCHAR(128), 
    IN _desc TEXT,
    IN _groupID INT, 
    IN _caseID INT, 
-- TYLKO WARTOŚCI BEZ PARAMETRÓW!! w formie'"vartość 1";;"wartość 2"'
    IN _values TEXT,
    IN _parameters TEXT) 
BEGIN
    DECLARE newItemID INT;
    DECLARE lastValID INT;
    DECLARE w INT ;  
    DECLARE indexBeg INT;
    DECLARE indexEnd INT;   

    -- Dodawanie nowego elementu
    INSERT INTO elementy (`nazwa_elementu`, `opis`, `id_obudowy`, `id_grupy`) 
        VALUES (_name, _desc, _caseID, _groupID);
    -- odczytywanie ID nowego elementu
    SET @newItemID = (SELECT last_insert_id());
    
    -- Odczytywanie wartości parametrów i zapisywanie ich w tabeli
    SET @values = REPLACE( _values, ';;', '),(');
    SET @values = CONCAT('(', @values, ')'); 
    SET @insert = CONCAT('INSERT INTO wartosci VALUES', @values); 
    PREPARE stmt FROM @insert;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    -- Odczytanie ID ostatniego elementu
    SET @lastValID = (SELECT last_insert_id());

    -- dodanie wiązanie pomiędzy parametrem o znanym ID z nowo wstawioną wartością
    -- INSERT INTO `test`.`wiazanie_elementyWartosci` (`id_parametru`, `ID_elementu`, `ID_wartosci`) VALUES (1, 16, 456);
                 
    SET @w = 1 ;
-- 3 poniżej powinna być ilością parametrów przekazanych do funkcji
     WHILE @w < 3 DO
              -- HMM...
        SET @w = @w+1;
     END WHILE;
END

Kod: Zaznacz cały

CREATE DEFINER=`root`@`%` PROCEDURE `checkItem`(
    OUT _elementID INT,
    OUT _status INT,
    IN _name varchar(128), 
    IN _groupID INT, 
    IN _caseID INT, 
    IN _parameters TEXT)  -- Parametry w postaci stringa:  'ID_Parametru;"Wartsc";;ID_Parametru;"Wartosc"' itd.
BEGIN

-- 
-- Procedura zwraca (przez wskaźnik _elementID, _status) wartości
-- 0 jeśli niema elementu
-- 1 jeśli element o podanej nazwie i obudowie istnieje, ale ma inne parametry
-- 2 jeśli element o podanej nazwie istnieje i ma takie same parametry

DECLARE parameterCount INT;

-- Wyfiltruj elementy z danej grupy o danych obudowach (olej opis!)
DROP TABLE IF EXISTS elementsList;
CREATE TEMPORARY TABLE elementsList ENGINE=MEMORY AS (
    SELECT 
        elementy.idelementy AS ID, 
        elementy.nazwa_elementu AS name, 
        elementy.id_obudowy AS caseID, 
        elementy.id_grupy AS groupID ,
        parametry.idparametry AS parameterID,
        parametry.nazwa_parametru AS parameterName,
        wartosci.wartosci AS value         
    FROM test.elementy
        INNER JOIN wiazanie_elementyWartosci ON test.elementy.idelementy = test.wiazanie_elementyWartosci.ID_elementu
        INNER JOIN wartosci ON test.wiazanie_elementyWartosci.ID_wartosci = wartosci.idwartosci
        INNER JOIN parametry ON id_parametru = idparametry
        INNER JOIN obudowy ON elementy.id_obudowy = obudowy.id_obudowy
WHERE ( elementy.id_grupy = _groupID ) AND (nazwa_elementu = _name) AND ( elementy.id_obudowy = _caseID ));
    
-- jeśli dany element jest w bazie
IF ( SELECT COUNT(1) FROM elementsList )
    THEN
        -- nie jest potrzebne ale w przypadku kiedy coś się stanie i tablica nie zwolni pamięci ratuje dupe
        DROP TABLE IF EXISTS t;
        CREATE TEMPORARY TABLE t ( id INT, val varchar(128) ) ENGINE=MEMORY;
        
        SET @values = REPLACE( _parameters, ';;', '),(');
        SET @values = REPLACE( @values , ';', ',');
        SET @values = CONCAT('(', @values, ')'); 
        SET @insert = CONCAT('INSERT INTO t VALUES', @values); 
        
        -- Execute INSERT statement
        PREPARE stmt FROM @insert;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
            
        SET @parameterCount = (SELECT COUNT(1) FROM t);
        -- sprawdź czy jest jakiś element w tymczasowej tablicy
        IF EXISTS (SELECT 1 FROM elementsList 
                            INNER JOIN t ON (t.id =  parameterID) AND (t.val = value) 
                        GROUP BY elementsList.ID HAVING COUNT(*) = @parameterCount LIMIT 0,1 )
            -- jest jakiś element który ma takie same parametry nazwe itd!!
            -- Ustaw status na 2 (znaleziono) i _elementID na znalezione ID
            THEN 
                SET _status = 2;
                SET _elementID = ( SELECT elementsList.ID
                        FROM elementsList 
                            INNER JOIN t ON (t.id =  parameterID) AND (t.val = value) 
                        GROUP BY elementsList.ID HAVING COUNT(*) = @parameterCount LIMIT 0,1 );
            ELSE
            -- znaleziono element niestety parametry się nie zgadzajo
                SET _status = 1;
        END IF;

        DROP TABLE elementsList;
        DROP TABLE t;
-- jeśli elementu niema ustaw _status i IDElementu na NULL (nie rób z nim nic)
ELSE
    SET _status = 0;
END IF;

END
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 11 gości