0 Пользователей и 1 Гость просматривают эту тему.
  • 34 Ответов
  • 528 Просмотров
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
Подскажите, как составить запрос вида:
Код: php
$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
  • 7465
  • 742
  • Разраблю понемногу
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
*

SmokerMan

  • Профи
  • 5333
  • 689
одним запросом делать - это как минимум неправильно
т.к. подзапрос может ничего не вернуть и в результате получится ошибка
Цитировать
IN ()
*

b2z

  • Support Team
  • 7465
  • 742
  • Разраблю понемногу
Ну тогда это просто невозможно. Как база поймёт, что среди строки, типа lala,11,lala,lala,12121, есть user_id? Или там как-то по другому хранятся данные или там все значения, это user_id?
*

robert

  • Профи
  • 4075
  • 376
Код: php-brief
$subquery=trim(implode(',',$db->loadColumn()),',');
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

denism300

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

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
одним запросом делать - это как минимум неправильно
т.к. подзапрос может ничего не вернуть и в результате получится ошибка
да, я попробовал так:
Код: php
$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 (), хотя подзапрос
Код: php
$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

  • Практически профи
  • 2806
  • 377
потому что если бы вы не поленились почитать документацию по функции imlode то увидели бы что implode — Объединяет элементы массива в строку, а вы что передаете вторым параметром и что хотите в итоге получить?
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

b2z

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

Сделайте
Код: php
echo $query->dump();
перед
Код: php
$db->setQuery($query); 
и посмотрите, как выглядит чистый запрос.
*

denism300

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

b2z

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

denism300

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

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
понятно. я, по причине неопытности, думал, что массив.
вот потому и надо было почитать на php.net документацию и как работает и что принимает функция implode http://php.net/manual/ru/function.implode.php
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

denism300

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

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

не работают. в интернетах тоже ничего толкового не нашел.
*

denism300

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

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
если вывести в дамп запрос, то видно, что он обрезает значение, по которому надо выбирать.
т.е. я делаю запрос так:
Код: php
$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();

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

Код: mysql
SELECT `t`.`id` FROM `table` AS `t` WHERE `t`.`name
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
также пробовал строку
Код: php
$query	->	where($db->quoteName('t.name'). ' <> ' . $db->quote('some_name'));
заменить на
Код: php
$query	->	where('t.name <> "some_name"');
но все равно обрезается значение
Код: sql
... WHERE `t`.`name
*

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
Ваш запрос (скопировал код ) у меня: SELECT `t`.`id` FROM `#__table` AS `t` WHERE `t`.`name` <> 'some_name'
Возможно у вас что то с кодировкой файла!
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

denism300

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

robert

  • Профи
  • 4075
  • 376
а на выходе получаю
А как вы получаете?
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
А как вы получаете?
вот так получаю:
Код: php
echo $query->dump();

все, победил эту проблему. сделал так:
Код: php
$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

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

denism300

  • Осваиваюсь на форуме
  • 134
  • 0
А что вы будете делать, когда нужно name=some_name_blah? Надо найти причину ошибки, хотя все довольно странно.
а вот про этот момент я не подумал. :(
но только при таком написании запроса он не обрезается.

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

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
а почему вы решили что запрос неправильно работает? и вы смотрели что выводит в просмотре кода?
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

dmitry_stas

  • Профи
  • 10012
  • 949
Код
echo $query->__toString();
тоже обрезает? покажите реальный запрос
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

Aleks.Denezh

  • Практически профи
  • 2806
  • 377
Код
echo $query->__toString();
тоже обрезает? покажите реальный запрос
Вообще то при "echo $query" и вызывается __toString()...
Мой  блог по разработке на Joomla CMS!
Хотите отблагодарить материально? Мой WMR: R861060179016
*

dmitry_stas

  • Профи
  • 10012
  • 949
так и есть, но dump выводится в тегах pre. хотел убедиться, что у ТС нет проблем с ними из за CSS или <> в запросе, например как вы сказали из-за неверной кодировки
« Последнее редактирование: 20.11.2016, 13:54:26 от dmitry_stas »
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Запись данных из формы в БД

Автор ushangi

Ответов: 3
Просмотров: 38
Последний ответ 11.09.2017, 17:24:22
от rkron
Запрос в бд

Автор sSeifeRr

Ответов: 7
Просмотров: 183
Последний ответ 02.08.2017, 18:28:19
от sSeifeRr
sql запрос из материла Joomla

Автор xak400

Ответов: 1
Просмотров: 157
Последний ответ 30.06.2017, 09:45:32
от SmokerMan
Вывести текст по условию, при AJAX изменении данных

Автор zeher

Ответов: 3
Просмотров: 201
Последний ответ 29.04.2017, 09:36:21
от zeher
Кнопки панели инструментов в 2 строки

Автор denism300

Ответов: 12
Просмотров: 300
Последний ответ 05.11.2016, 17:03:39
от denism300