@vdorokhin89

Как привести к числу строку в mysql?

Пытаюсь вывести список статей и авторов к ним из второй таблицы. Первым вложенным запросом получаю список id авторов из промежуточной таблицы, а вторым пытаюсь извлечь список авторов в виде строки. Проблема в том , что извлекается только первый автор.
При выводе инфы из первого вложенного запроса приходит все правильно- строка типа "3, 5, 7".
Из второго , если ему вручную проставить в запросе в IN 3, 5, 7, то все авторы извлекаются тоже правильно, но если передать именно сам результат первого запроса (list), то выводится только первый автор.
Пришел к выводу, что причина в том, что из первого запроса приходит тип строка, а не перечисление чисел, но ни CAST ни CONVERT на результат не влияют. Можно ли как-то конвертировать строку с числами перечислением через запятую? Или может не там конвертирую ее? Или может посоветуете как сделать по другому. Заранее благодарю
SELECT 
*
(SELECT GROUP_CONCAT(author_id SEPARATOR ", ") FROM Authors_en WHERE en_id = id ) as list,
(SELECT GROUP_CONCAT(surename) FROM autors WHERE id IN( CONVERT(list , SIGNED) ) as authors FROM table
  • Вопрос задан
  • 426 просмотров
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
У художника Франсиско Гойи есть известная картина, "Сон разума рождает чудовищ".
Вот этот запрос как раз и есть такое чудовище.

Он тем смешнее, что БД как раз и приводит строку 3, 5, 7 к числу. Получая в результате единственно возможный результат - 3.

Надо не маяться дурью с group_concat, а просто сделать отдельный запрос к таблице авторов. И перебрав в цикле записи первой таблицы добавить к каждой подмассив с авторами.

Либо сделать нормальный джойн и сгруппировать в вызывающем скрипте
Ответ написан
@Akina
Сетевой и системный админ, SQL-программист.
Можно ли как-то конвертировать строку с числами перечислением через запятую?

Можно. Но вот получить набор критериев для применения в WHERE IN - нельзя.

В принципе задача в нынешнем виде (если не делать как нужно, что описано в ответе FanatPHP) имеет минимум пару решений.

Можно изменить сепаратор на просто запятую, без пробела, и использовать FIND_IN_SET(). Но надо понимать, что при этом будет выполняться строковый неиндексированный поиск подстроки - то есть гарантированно медленно.

Можно добавить скобки, превратив строковый список в JSON-массив, и распарсить его на отдельные элементы функцией JSON_TABLE(). Но и этот метод быстродействием не отличится.

Так что срочно забывайте эту дурь с GROUP_CONCAT() и используйте нормальный JOIN.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы