Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] jak przekazać id do procedury, w przypadku gdy id jest wiele
fragles
post
Post #1





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 14.12.2008

Ostrzeżenie: (0%)
-----


chodzi o coś takiego, że wybieram ileś tam typów i dla tych typów wywołuje procedurę
czyli po SQL-owemu byłoby to
WHERE id IN (1,2,3 itd)

przekazuję to jako tekst - '1,2,3' - w takiej formie
ale jest problem gdy wstawiam to bezpośrednio do zapytania mam błąd

Truncated incorrect DOUBLE value: '1,2,3'

a wynik jest pobierany tylko dla ID 1 (dokładniej dla pierwszego ID)

Jak to zrobić?


na razie robię tak
- zapytanie jako string
- na końcu w procedurze używam instrukcji

SET @dyn_sql=sqlQuery;
PREPARE s1 FROM @dyn_sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;

ale czy można jakoś bezpośrednio do SQL - bez potrzeby tworzenia zapytania tekstu - przekazać wiele numerów ID?

Ten post edytował fragles 6.10.2009, 07:29:28
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Pytanie mam... Czy te numery id podajesz z POST lub GET, czy może także wyciągasz z bazy danych? Ja zazwyczaj mam ten drugi przypadek i wtedy ładnie się upraszcza problem, gdyż wtedy przekazujesz je jako podzapytanie przy IN tak jak sugerujesz na początku wedle schematu:
  1. SELECT coś_tam FROM tabelki WHERE id IN ( SELECT id FROM inna_tabela )

Jak sam widzisz w podzapytaniu tylko id przy select ustawiasz.
Przypadku pierwszego nie miałem okazji stosować z racji takiego rozpisania bazy, że rozwiązanie drugie mi wystarcza (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
jmail
post
Post #3





Grupa: Zarejestrowani
Postów: 352
Pomógł: 53
Dołączył: 10.08.2009

Ostrzeżenie: (0%)
-----


  1.  
  2. --input - to jest parametr przekazywany do funkcji cyzli lista indexów
  3.  
  4. declare delim varchar(10) DEFAULT ',';
  5. declare foundPos tinyint UNSIGNED;
  6. declare tmpTxt text;
  7. declare delimLen tinyint UNSIGNED;
  8. declare element text;
  9.  
  10. DROP TEMPORARY TABLE IF EXISTS tmpValues;
  11. CREATE TEMPORARY TABLE tmpValues
  12. (
  13. valueId text NOT NULL DEFAULT ''
  14. ) engine = memory;
  15.  
  16. SET delimLen = length(delim);
  17. SET tmpTxt = input;
  18.  
  19. SET foundPos = instr(tmpTxt,delim);
  20. while foundPos <> 0 do
  21. SET element = substring(tmpTxt, 1, foundPos-1);
  22. SET tmpTxt = REPLACE(tmpTxt, concat(element,delim), '');
  23.  
  24.  
  25. INSERT INTO tmpValues (valueId) VALUES ( element);
  26.  
  27. SET foundPos = instr(tmpTxt,delim);
  28. end while;
  29.  
  30. IF tmpTxt <> '' then
  31. INSERT INTO tmpValues (valueId) VALUES (tmpTxt);
  32. end IF;
  33.  
  34. --i robisz
  35.  
  36. SELECT bla bla bla WHERE id IN (SELECT valueId FROM tmpValues)
  37.  


na koniec zdropuj tmpValues

Ten post edytował jmail 6.10.2009, 14:08:24
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 16:51