powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Результат Select розместить одной строкой.
8 сообщений из 8, страница 1 из 1
Результат Select розместить одной строкой.
    #33239248
Steven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть запрос:
Код: plaintext
SELECT BonusID FROM ut_bonuses where id= 10 
В результате получаем 0-5 записей.

Как розместить их так, что-би результат был сторока с этими значениями.

Пример:
Получаем 4 строчки
2
3
7
10

А нужно строка: 2 3 7 10
Так как этот запрос будет частью другого запроса.
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33239394
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Set @a:='';
SELECT @a:=concat(@a,BonusID,',') FROM ut_bonuses where id=10;

select @a;
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33239944
Steven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня так неработает.
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33241606
Steven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ПОЧТИ рабочая функция.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DELIMITER $$
DROP FUNCTION IF EXISTS `nekki-test`.`bonus`$$
CREATE FUNCTION `nekki-test`.`bonus` (IN_PlayerID int) RETURNS tinytext
DETERMINISTIC

BEGIN

DECLARE a1 TINYTEXT  DEFAULT '';
DECLARE v2 INT DEFAULT  0 ;
set @v1= 0 ;

Set v2=(SELECT count(*) FROM ut_bonuses where Playerid=IN_PlayerID);

  WHILE @v1 < v2 DO
    SET a1 = concat(a1,(SELECT `BonusID` FROM `ut_bonuses` where `PlayerID`=IN_PlayerID limit @v1, 1 ));
    SET @v1 = @v1 +  1 ;
  END WHILE;

return a1;
END$$
DELIMITER ;

Проблема в том, что ругается на
Код: plaintext
limit @v1, 1 ));
Система нехочет что-бы в строке лимита была переменная. Наверно стоит защита от того, что туда могут вписать поле таблицы.
Что делать?
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33243870
Steven13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно, вот решение:


Код: plaintext
1.
2.
3.
4.
SET BonusOUT = COALESCE(
(SELECT GROUP_CONCAT(SmallName_rus, if (Level> 1 ,Level,'') SEPARATOR ' ')
FROM ut_bonuses LEFT JOIN ut_bonus_types USING(BonusID)  where PlayerID=IN_PlayerID
GROUP BY PlayerID),
'');

Всё благодаря такой класной функции как GROUP_CONCAT

Хотя до этого решения, проблема была уже решена, но так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SET CounBonus=(SELECT count(*) FROM `ut_bonuses` where PlayerID=IN_PlayerID);

if CounBonus> 0  then  SET BonusOUT = (SELECT concat(t.SmallName_eng,if (b.Level> 1 ,b.Level,'')) 
FROM `ut_bonuses` b LEFT OUTER JOIN `ut_bonus_types` t ON t.BonusID = b.BonusID  where b.PlayerID=IN_PlayerID limit  0 , 1 ); end if;

if CounBonus> 1  then  SET BonusOUT = (SELECT concat(BonusOUT,' ',t.SmallName_eng,if (b.Level> 1 ,b.Level,'')) 
FROM `ut_bonuses` b LEFT OUTER JOIN `ut_bonus_types` t ON t.BonusID = b.BonusID  where b.PlayerID=IN_PlayerID limit  1 , 1 ); end if;

if CounBonus> 2  then  SET BonusOUT = (SELECT concat(BonusOUT,' ',t.SmallName_eng,if (b.Level> 1 ,b.Level,'')) 
FROM `ut_bonuses` b LEFT OUTER JOIN `ut_bonus_types` t ON t.BonusID = b.BonusID  where b.PlayerID=IN_PlayerID limit  2 , 1 ); end if;

if CounBonus> 3  then  SET BonusOUT = (SELECT concat(BonusOUT,' ',t.SmallName_eng,if (b.Level> 1 ,b.Level,'')) 
FROM `ut_bonuses` b LEFT OUTER JOIN `ut_bonus_types` t ON t.BonusID = b.BonusID  where b.PlayerID=IN_PlayerID limit  3 , 1 ); end if;

if CounBonus> 4  then  SET BonusOUT = (SELECT concat(BonusOUT,' ',t.SmallName_eng,if (b.Level> 1 ,b.Level,'')) 
FROM `ut_bonuses` b LEFT OUTER JOIN `ut_bonus_types` t ON t.BonusID = b.BonusID  where b.PlayerID=IN_PlayerID limit  4 , 1 ); end if;
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33247284
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Steven13Всё благодаря такой класной функции как GROUP_CONCAT
О какой версии mySQL идёт речь? Мой mySQL 4.1.3b в упор такой функции не знает.
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33247322
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GROUP_CONCAT() was added in MySQL 4.1.

Note: Before MySQL 4.1.6, there are some small limitations with GROUP_CONCAT() for BLOB and TEXT values when it comes to using DISTINCT together with ORDER BY. To work around this limitation, use MID(expr,1,255) instead.
...
Рейтинг: 0 / 0
Результат Select розместить одной строкой.
    #33247770
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем если руки косые - то можно писать функции, если от 4.1 то можно group_concat, но она не всегда помогает.
А наиболее легко это парой запросов, которые я написал и работать они не могут, потому что все это давно уже обкатано на практике, так то.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Результат Select розместить одной строкой.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]