Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: #1172 - Result consisted of more than one row
Forum PHP.pl > Forum > Bazy danych > MySQL
jason300
Witam mam taki mały problem po migracji z serwera windowsowego na centosa z bazy mysql 5.5.16 do 5.5.28 zapytanie które działało prawidłowo zaczyna mi zwracać błąd #1172 - Result consisted of more than one row , prosiłbym o pomoc co mam zrobić żeby to zapytanie działało prawidłowo , oczywiście próbowałem w różnych miejscach wstawić limit 1 lecz nie interesuje mnie to żeby wyświetlało tylko jeden rekord lecz wszystkie (około 600 ) co robi pomyślnie na windowsie a na centosie już nie .


  1. SELECT *,getparentname_bytype(unit.id, 1)
  2. AS spolka , getparentid_bytype(unit.id, 1)
  3. AS spolka_id, getparentname_bytype(unit.id, 2)
  4. AS pion, getparentname_bytype(unit.id, 3)
  5. AS departament, get_przelozony(unit.id) AS przelozony, get_przelozony_email(unit.id)
  6. AS przelozony_email, email, unit.name
  7. AS "stanowisko"
  8. FROM unit
  9. LEFT JOIN employeeunit ON unit.id = employeeunit.unit_id
  10. LEFT JOIN employee ON employeeunit.employee_id = employee.id WHERE unittype_id=5
  11. AND lastname<>""
  12. AND getparentid_bytype(unit.id, 1)=2184
  13. ORDER BY spolka
  14. DESC, lastname


a tutaj mam poszegolne funkcje najpierw getparentid_bytype
  1. FUNCTION `getparentid_bytype`(id1 int(11), tp int(11)) RETURNS int(11)
  2. BEGIN
  3.  
  4. SET @parent_id = id1, @fuse = 1, @name1="", @unittype_id=0;
  5. petla: while 1 do
  6. SELECT parent_id, unittype_id, name
  7. INTO @parent_id1, @unittype_id, @name1
  8. FROM unit
  9. WHERE id=@parent_id;
  10. IF @unittype_id = tp AND @parent_id<>id1 AND @fuse>1
  11. THEN
  12. LEAVE petla;
  13. END IF;
  14. SET @parent_id=@parent_id1;
  15. IF @parent_id=22 THEN SET @name1=""; LEAVE petla; END IF;
  16. SET @fuse = @fuse + 1;
  17. IF @fuse > 100 THEN LEAVE petla; END IF;
  18. END WHILE petla;
  19. RETURN @parent_id;


getparentname_bytype

  1. FUNCTION `getparentname_bytype`(id1 int(11), tp int(11)) RETURNS varchar(255) CHARSET cp1250
  2. BEGIN
  3.  
  4. SET @parent_id = id1, @fuse = 1, @name1="", @unittype_id=0;
  5. petla: while 1 do
  6. SELECT parent_id, unittype_id, name
  7. INTO @parent_id1, @unittype_id, @name1
  8. FROM unit
  9. WHERE id=@parent_id;
  10. IF @unittype_id = tp AND @parent_id<>id1 AND @fuse>1
  11. THEN
  12. LEAVE petla;
  13. END IF;
  14. SET @parent_id=@parent_id1;
  15. IF @parent_id=22 THEN SET @name1=""; LEAVE petla; END IF;
  16. SET @fuse = @fuse + 1;
  17. IF @fuse > 100 THEN LEAVE petla; END IF;
  18. END WHILE petla;
  19. RETURN @name1;


i oczywiscie getprzelozony_mail
  1. FUNCTION `get_przelozony_email`(id1 int(11)) RETURNS varchar(255) CHARSET cp1250
  2. BEGIN
  3.  
  4. SET @parent_id = id1, @fuse = 1, @name1="", @unittype_id=0;
  5. petla: while 1 do
  6.  
  7. SELECT parent_id, unittype_id, unit.id, name, employee.lastname, employee.firstname, employee.id,email
  8. INTO @parent_id, @unittype_id, @id, @name1, @lastname, @firstname, @eid, @email
  9. FROM unit
  10. LEFT JOIN employeeunit ON unit.id = employeeunit.unit_id
  11. LEFT JOIN employee ON employeeunit.employee_id = employee.id
  12. WHERE unit.id=@parent_id ;
  13. IF @unittype_id = 5 AND @id<>id1 AND @lastname<>'' THEN LEAVE petla; END IF;
  14. IF @parent_id=22 THEN SET @name1=""; LEAVE petla; END IF;
  15. SET @fuse = @fuse + 1;
  16. IF @fuse > 100 THEN LEAVE petla; END IF;
  17. END WHILE petla;
  18. RETURN concat(@email)
  19. END */;;


po namyśle wydaje się że jednak pominąłem jedną funkcję i na 100 procent to ona jest problematyczna

  1. BEGIN
  2.  
  3.  
  4. SET @parent_id = id1, @fuse = 1, @name1="", @unittype_id=0;
  5.  
  6. petla: while 1 do
  7.  
  8. SELECT parent_id, unittype_id, unit.id, name, employee.lastname, employee.firstname
  9. INTO @parent_id, @unittype_id, @id, @name1, @lastname, @firstname
  10. FROM unit
  11. LEFT JOIN employeeunit ON unit.id = employeeunit.unit_id
  12. LEFT JOIN employee ON employeeunit.employee_id = employee.id
  13. WHERE unit.id=@parent_id ;
  14. IF @unittype_id = 5 AND @id<>id1 AND @lastname<>'' THEN LEAVE petla; END IF;
  15. IF @parent_id=22 THEN SET @name1=""; LEAVE petla; END IF;
  16.  
  17. SET @fuse = @fuse + 1;
  18. IF @fuse > 100 THEN LEAVE petla; END IF;
  19. END WHILE petla;
  20.  
  21. RETURN concat(@id,' ',@firstname, ' ',@lastname);
  22.  
  23. END


ok temat rozwiązany dodanie limit 1 w dwóch ztych funkcji po select into ..... where ... spowodowało że wszystko zaczęło działać pozdrawiam
wiiir
Cytat(jason300 @ 14.01.2013, 10:39:39 ) *
ok temat rozwiązany dodanie limit 1 w dwóch ztych funkcji po select into ..... where ... spowodowało że wszystko zaczęło działać pozdrawiam


moze i dziala.. ale przypuszczam ze zle.. bo zapytania w funkcjach zapewne zwracaja ci wiecej niz 1 rekord a ty na chama powiedziales ze wiecej nie chcesz? Compilator to łyka.. ale to napewno chodzi ci o uzyskanie dokladnie 1 rekordu badz czy nie chcesz obsluzyc wszystkich wynikow?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.