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

denism300

  • Захожу иногда
  • 209
  • 5 / 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

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Я что-то не пойму, что хранится в vendor_params? Там какие-то значения через запятую и среди них есть user_id?
*

denism300

  • Захожу иногда
  • 209
  • 5 / 0
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
одним запросом делать - это как минимум неправильно
т.к. подзапрос может ничего не вернуть и в результате получится ошибка
Цитировать
IN ()
*

b2z

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код: php-brief
$subquery=trim(implode(',',$db->loadColumn()),',');
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

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

denism300

  • Захожу иногда
  • 209
  • 5 / 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

  • Живу я здесь
  • 3406
  • 428 / 4
потому что если бы вы не поленились почитать документацию по функции imlode то увидели бы что implode — Объединяет элементы массива в строку, а вы что передаете вторым параметром и что хотите в итоге получить?
*

b2z

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

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

denism300

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

b2z

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

denism300

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

Aleks.Denezh

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

denism300

  • Захожу иногда
  • 209
  • 5 / 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

  • Захожу иногда
  • 209
  • 5 / 0
запрос не выдает нужный результат
*

denism300

  • Захожу иногда
  • 209
  • 5 / 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
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

denism300

  • Захожу иногда
  • 209
  • 5 / 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

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

denism300

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

robert

  • Живу я здесь
  • 4974
  • 457 / 20
а на выходе получаю
А как вы получаете?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

denism300

  • Захожу иногда
  • 209
  • 5 / 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

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

denism300

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

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

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
а почему вы решили что запрос неправильно работает? и вы смотрели что выводит в просмотре кода?
*

dmitry_stas

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

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Код
echo $query->__toString();
тоже обрезает? покажите реальный запрос
Вообще то при "echo $query" и вызывается __toString()...
*

dmitry_stas

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

Селект с возможностью выбора всех данных материала

Автор bombapiter

Ответов: 3
Просмотров: 514
Последний ответ 30.04.2021, 13:17:13
от v42bis
Помогите оптимизировать getDBO запрос

Автор goga_pgasovav

Ответов: 5
Просмотров: 450
Последний ответ 10.12.2020, 12:36:56
от goga_pgasovav
Произошла ошибка при получении данных json: код состояния http 0. error

Автор Андрей Купцов

Ответов: 2
Просмотров: 2710
Последний ответ 18.12.2019, 10:14:55
от Андрей Купцов
Вывод данных соглано таблицы Excel

Автор warlocksp

Ответов: 56
Просмотров: 1845
Последний ответ 28.02.2019, 23:56:23
от warlocksp
Юникод при записи параметров в базу данных

Автор Taatshi

Ответов: 12
Просмотров: 883
Последний ответ 30.10.2017, 14:27:31
от SeBun