Вопрос к профи по MySQL

Skom
На сайте с 02.12.2006
Offline
166
394

Что-то я уже совсем туплю, или не понимаю что-то совсем простое.

Итак:


mysql> select Code,LocalName from Languages where Code in ("en","fr");
+------+-----------+
| Code | LocalName |
+------+-----------+
| en | English |
| fr | Français |
+------+-----------+
2 rows in set (0.00 sec)

Вроде, всё зашибись.

Теперь, попробую съэмулировать часть, которая в "in", исходя из того, что список кодов на входе просто разделяется запятой:


mysql> select concat('"',replace('en,fr',',','","'),'"');
+--------------------------------------------+
| concat('"',replace('en,fr',',','","'),'"') |
+--------------------------------------------+
| "en","fr" |
+--------------------------------------------+
1 row in set (0.00 sec)

Тоже всё красиво.

А теперь попробую соединить обе части:


mysql> select Code,LocalName from Languages where Code in (concat('"',replace('en,fr',',','","'),'"'));
Empty set (0.00 sec)

Где косячу? :rolleyes:

Cras amet qui numquam amavit quique amavit cras amet
Оптимизайка
На сайте с 11.03.2012
Offline
396
#1
Skom:
А теперь попробую соединить обе части

А так нельзя, т.к. у вас concat выдает одну строку '"en","fr"' а не две "en" и "fr".


create table Languages(Code varchar(60), LocalName varchar(60));
insert into Languages (Code, LocalName) values ("en", "English");
insert into Languages (Code, LocalName) values ("fr", "France");
insert into Languages (Code, LocalName) values ("\"en\",\"fr\"", "English-France");
select Code,LocalName from Languages where Code in (concat('"',replace('en,fr',',','","'),'"'));
> "en","fr" English-France

Наверное вам подошло бы


select Code,LocalName from Languages where FIND_IN_SET(Code, "en,fr");
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
S
На сайте с 30.09.2016
Offline
469
#2
Skom:
Где косячу? 🙄

in ("en","fr") - здесь в скобках перечисление строковых значений.

in (concat('"',replace('en,fr',',','","'),'"')) - здесь в скобках одно строковое значение, полученное как результат функции concat().

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
VC
На сайте с 27.10.2002
Offline
127
VIC
#3
Skom:

Где косячу? 🙄

Там, где прямо в запросе MYSQL пытаетесь формировать этот запрос. Механический перенос из php?

Совсем простое – то, что во время интерпретации строки запроса эту строку бессмысленно изменять. А вы пытаетесь и запрос исполнить, и в то же время строку запроса изменить.

Skom
На сайте с 02.12.2006
Offline
166
#4
VIC:
Там, где прямо в запросе MYSQL пытаетесь формировать этот запрос. Механический перенос из php?

Нед.

Это просто попытка выделить проблемную для меня часть из довольно большого запроса индексера сфинкса.

---------- Добавлено 11.11.2018 в 23:30 ----------

Всем огромное спасибо!

Всё заработало.

Вот таки жопой чуял, что дело в типах. :D

VC
На сайте с 27.10.2002
Offline
127
VIC
#5

Все верно, дело в типах.

Но и в работе SQL тоже. Если бы в запросе было ("en","fr"), это было бы понято как перечисляемые значения. А работающая по ходу исполнения функция concat() отдает строку, и это не то же самое, что до исполнения вставить эту строку в запрос.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий