Форум русской поддержки Joomla!® CMS
09.12.2016, 15:39:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Как составить запрос с выбором данных из строки с разделителем?

 (Прочитано 239 раз)
0 Пользователей и 1 Гость смотрят эту тему.
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« : 16.11.2016, 16:07:18 »

Подскажите, как составить запрос вида:
Код
$db 		= 	$this->getDBO();
 
$subquery = $db->getQuery(true);
$subquery -> select($db->quoteName('b.vendor_params'));
$subquery -> from($db->quoteName('#__vendors', 'b'));
$subquery -> where($db->quoteName('b.vendor_id'). ' = 1');
 
$query = $db->getQuery(true);
$query -> select($db->quoteName('a.user_code'));
$query -> from($db->quoteName('#__mycomp', 'a'));
$query -> where($db->quoteName('a.user_id'). ' IN (' . $subquery . ')');
$db -> setQuery($query);
$result = $db->loadColumn();

если поле b.vendor_params содержит данные, разделенные запятой. структуру таблицы b изменить нельзя.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #1 : 16.11.2016, 16:16:10 »

Я что-то не пойму, что хранится в vendor_params? Там какие-то значения через запятую и среди них есть user_id?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #2 : 16.11.2016, 16:33:08 »

да, именно так.
Записан
SmokerMan
Профи
********

Репутация: +694/-25
Online Online

Пол: Мужской
Сообщений: 5225



« Ответ #3 : 16.11.2016, 16:41:00 »

одним запросом делать - это как минимум неправильно
т.к. подзапрос может ничего не вернуть и в результате получится ошибка
Цитировать
IN ()
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #4 : 16.11.2016, 16:41:34 »

Ну тогда это просто невозможно. Как база поймёт, что среди строки, типа lala,11,lala,lala,12121, есть user_id? Или там как-то по другому хранятся данные или там все значения, это user_id?
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3593


« Ответ #5 : 16.11.2016, 16:46:50 »

Код
$subquery=trim(implode(',',$db->loadColumn()),',');
 
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #6 : 16.11.2016, 16:56:47 »

Ну тогда это просто невозможно. Как база поймёт, что среди строки, типа lala,11,lala,lala,12121, есть user_id? Или там как-то по другому хранятся данные или там все значения, это user_id?
там все значения user_id, т.е. там хранится строка вида: 123,56,889,416 и т.п.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #7 : 16.11.2016, 17:02:06 »

одним запросом делать - это как минимум неправильно
т.к. подзапрос может ничего не вернуть и в результате получится ошибка
да, я попробовал так:
Код
$db 		= 	$this->getDBO();
 
$subquery = $db->getQuery(true);
$subquery -> select($db->quoteName('b.vendor_params'));
$subquery -> from($db->quoteName('#__vendors', 'b'));
$subquery -> where($db->quoteName('b.vendor_id'). ' = 1');
$db -> setQuery($subquery);
$subresult = $db->loadResult();
 
$query = $db->getQuery(true);
$query -> select($db->quoteName('a.user_code'));
$query -> from($db->quoteName('#__mycomp', 'a'));
$query -> where($db->quoteName('a.user_id'). ' IN (' . implode(',', $subresult). ')');
$db -> setQuery($query);
$result = $db->loadColumn();

и получил ошибку IN (), хотя подзапрос
Код
$subquery = 	$db->getQuery(true);
$subquery -> select($db->quoteName('b.vendor_params'));
$subquery -> from($db->quoteName('#__vendors', 'b'));
$subquery -> where($db->quoteName('b.vendor_id'). ' = 1');
$db -> setQuery($subquery);
$subresult = $db->loadResult();

возвращает результат вида 123,56,889,416
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #8 : 16.11.2016, 17:14:32 »

потому что если бы вы не поленились почитать документацию по функции imlode то увидели бы что implode — Объединяет элементы массива в строку, а вы что передаете вторым параметром и что хотите в итоге получить?
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #9 : 16.11.2016, 18:05:59 »

там все значения user_id, т.е. там хранится строка вида: 123,56,889,416 и т.п.
Ну тогда Ваш первый запрос по идее верный. Получаете ошибку?

Сделайте
Код
echo $query->dump();
перед
Код
$db->setQuery($query);
и посмотрите, как выглядит чистый запрос.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #10 : 16.11.2016, 19:08:52 »

потому что если бы вы не поленились почитать документацию по функции imlode то увидели бы что implode — Объединяет элементы массива в строку, а вы что передаете вторым параметром и что хотите в итоге получить?
я знаю, что означает implode. меня тоже смутило использование данной функции, но везде в интернете, где я встречал подобное, советовали делать так. например, тут
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #11 : 16.11.2016, 19:21:59 »

я знаю, что означает implode. меня тоже смутило использование данной функции, но везде в интернете, где я встречал подобное, советовали делать так. например, тут
Так это если у Вас массив. У Вас же готовая строка 123,56,889,416 - она в IN() прекрасно становится.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #12 : 16.11.2016, 20:37:33 »

Так это если у Вас массив. У Вас же готовая строка 123,56,889,416 - она в IN() прекрасно становится.
понятно. я, по причине неопытности, думал, что массив.
с запросом разобрался. изначальный вариант заработал.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #13 : 17.11.2016, 02:07:01 »

понятно. я, по причине неопытности, думал, что массив.
вот потому и надо было почитать на php.net документацию и как работает и что принимает функция implode http://php.net/manual/ru/function.implode.php
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #14 : 17.11.2016, 18:08:13 »

вот потому и надо было почитать на php.net документацию и как работает и что принимает функция implode http://php.net/manual/ru/function.implode.php
спс, буду знать теперь.

такой вопрос:
пытаюсь составить запрос вида:
Код
SELECT `t`.`id` FROM `table` AS `t` WHERE `t`.`name` <> 'some_name'
конструкции вида:
!=
<>
NOT LIKE

не работают. в интернетах тоже ничего толкового не нашел.
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #15 : 17.11.2016, 18:44:55 »

Что значит не работают?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #16 : 19.11.2016, 14:49:00 »

запрос не выдает нужный результат
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #17 : 19.11.2016, 15:37:15 »

если вывести в дамп запрос, то видно, что он обрезает значение, по которому надо выбирать.
т.е. я делаю запрос так:
Код
$db 	= 	$this->getDBO();
$query = $db->getQuery(true);
$query -> select($db->quoteName('t.id'));
$query -> from($db->quoteName('#__table', 't'));
$query -> where($db->quoteName('t.name'). ' <> ' . $db->quote('some_name'));
$db -> setQuery($query);
$result = $db->loadResult();

а на выходе получаю

Код
SELECT `t`.`id` FROM `table` AS `t` WHERE `t`.`name
Записан
b2z
Support Team
*****

Репутация: +710/-0
Online Online

Пол: Мужской
Сообщений: 7538


Разраблю понемногу


« Ответ #18 : 19.11.2016, 16:38:06 »

Затрудняюсь ответить, странно как-то.
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #19 : 19.11.2016, 17:16:36 »

также пробовал строку
Код
$query	->	where($db->quoteName('t.name'). ' <> ' . $db->quote('some_name'));
заменить на
Код
$query	->	where('t.name <> "some_name"');
но все равно обрезается значение
Код
... WHERE `t`.`name
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #20 : 19.11.2016, 17:27:13 »

Ваш запрос (скопировал код ) у меня: SELECT `t`.`id` FROM `#__table` AS `t` WHERE `t`.`name` <> 'some_name'
Возможно у вас что то с кодировкой файла!
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #21 : 19.11.2016, 18:04:55 »

с кодировкой все нормально, т.к. в этом файле модели и другие запросы есть, они корректно работают.
ок. буду соображать дальше, в чем может быть ошибка.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3593


« Ответ #22 : 19.11.2016, 18:36:33 »

а на выходе получаю
А как вы получаете?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #23 : 19.11.2016, 18:49:02 »

А как вы получаете?
вот так получаю:
Код
echo $query->dump();

все, победил эту проблему. сделал так:
Код
$db 	= 	$this->getDBO();
$query = $db->getQuery(true);
$query -> select($db->quoteName('t.id'));
$query -> from($db->quoteName('#__table', 't'));
$query -> where($db->quoteName('t.name'). ' NOT LIKE ' . $db->quote('%some_name%'));
$db -> setQuery($query);
$result = $db->loadResult();
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3593


« Ответ #24 : 19.11.2016, 19:14:53 »

А что вы будете делать, когда нужно name=some_name_blah? Надо найти причину ошибки, хотя все довольно странно. Кстати, вы написали, что получаете строку запроса путем echo $query->dump();. У вас что, внешний скрипт?
Записан
denism300
Осваиваюсь на форуме
***

Репутация: +0/-0
Online Online

Сообщений: 103


« Ответ #25 : 19.11.2016, 19:37:50 »

А что вы будете делать, когда нужно name=some_name_blah? Надо найти причину ошибки, хотя все довольно странно.
а вот про этот момент я не подумал. Sad
но только при таком написании запроса он не обрезается.

Кстати, вы написали, что получаете строку запроса путем echo $query->dump();. У вас что, внешний скрипт?
нет, внешних скриптов нет.
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #26 : 19.11.2016, 21:22:02 »

а почему вы решили что запрос неправильно работает? и вы смотрели что выводит в просмотре кода?
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #27 : 20.11.2016, 11:51:53 »

Код:
echo $query->__toString();
тоже обрезает? покажите реальный запрос
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

Пол: Мужской
Сообщений: 2762



« Ответ #28 : 20.11.2016, 14:26:48 »

Код:
echo $query->__toString();
тоже обрезает? покажите реальный запрос
Вообще то при "echo $query" и вызывается __toString()...
Записан
dmitry_stas
Профи
********

Репутация: +798/-4
Offline Offline

Сообщений: 7778



« Ответ #29 : 20.11.2016, 14:51:13 »

так и есть, но dump выводится в тегах pre. хотел убедиться, что у ТС нет проблем с ними из за CSS или <> в запросе, например как вы сказали из-за неверной кодировки
« Последнее редактирование: 20.11.2016, 14:54:26 от dmitry_stas » Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet