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

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
В общем, есть оптовый прайс поставщика который меняется каждую неделю. 27 тыс. наименований. И есть 25 тыс. товаров в базе MySQL.
Идея такова: создать новую таблицу в базе с нужными колонками и с этой таблицы вставлять значения цен напрямую в virtuemart_product_prices при совпадении имен.
Т.к. весь шаблон завязан на столбце product_sku таблицы virtuemart_products
А цены в таблице virtuemart_product_prices. И между собой таблицы virtuemart_product_prices и virtuemart_products связаны только столбцами virtuemart_product_id.
То основное условие выборке цен из новой таблицы с новыми ценами будет совпадение virtuemart_product_id в этих двух таблицах.
Вроде логично)))

Итак что у меня получилось.
Я создал таблицу virtuemart_products_01 где есть product_sku (столбец `aaa`) и есть столбец с ценами 'price'

Вот мой sql запрос который не работает...


UPDATE `ist5l_virtuemart_product_prices`
SET `product_price`=`price`
FROM 'ist5l_virtuemart_product_prices', 'ist5l_virtuemart_products_01', 'ist5l_virtuemart_products'
WHERE ((`ist5l_virtuemart_products_01`.`aaa` = `ist5l_virtuemart_products`.`product_sku`) AND (`ist5l_virtuemart_products`.`virtuemart_product_id` = `ist5l_virtuemart_product_prices`.`virtuemart_product_id`))


Выдает ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM 'ist5l_virtuemart_product_prices', 'ist5l_virtuemart_products_01', 'ist5l_v' at line 3


Знающие люди, подскажите, в чем может быть дело.
Заранее благодарю!
*

voland

  • Легенда
  • 11030
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
*

evgen777

  • Давно я тут
  • 657
  • 62 / 2
Синтаксис запроса UPDATE посмотрите. Что у вас тут делает FROM?
Разработка, доработка расширений для Joomla!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
кавычки такие сделать? ' вместо ` ?
FROM вообще убрать?
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
UPDATE `ist5l_virtuemart_product_prices`
SET `product_price`=`price`
WHERE ((`ist5l_virtuemart_products_01`.`aaa` = `ist5l_virtuemart_products`.`product_sku`) AND (`ist5l_virtuemart_products`.`virtuemart_product_id` = `ist5l_virtuemart_product_prices`.`virtuemart_product_id`))


выдает ошибку
#1054 - Unknown column 'ist5l_virtuemart_products_01.aaa' in 'where clause'
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Во первых, у вас куча синтаксических и логических ошибок.
Во вторых, на одном MySQL вы далеко не уедете: он не для этого. Используйте PHP.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Во первых, у вас куча синтаксических и логических ошибок.
Во вторых, на одном MySQL вы далеко не уедете: он не для этого. Используйте PHP.

Можете дать наводку?:)
Хоть где копать?))
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: sql
UPDATE `ist5l_virtuemart_product_prices`
SET `product_price`= ( SELECT `price` FROM `ist5l_virtuemart_products_01`
WHERE `ist5l_virtuemart_products`.`virtuemart_product_id` = `ist5l_virtuemart_products_01`.`virtuemart_product_id`
LIMIT 1 )

Чтобы запрос выполнялся быстро поля `virtuemart_product_id` должны быть индексируемые и одного типа и размера
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
ТС использует product_sku в новой таблице. Думаю, ему нужно что-то вроде этого:
Спойлер
[свернуть]
Но с 27000 записями такое, наверное, не пройдет. Лучше связать по virtuemart_product_id:
Спойлер
[свернуть]
« Последнее редактирование: 15.01.2015, 10:23:43 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Код: sql
UPDATE `ist5l_virtuemart_product_prices`
SET `product_price`= ( SELECT `price` FROM `ist5l_virtuemart_products_01`
WHERE `ist5l_virtuemart_products`.`virtuemart_product_id` = `ist5l_virtuemart_products_01`.`virtuemart_product_id`


Выдает ошибку:
#1054 - Unknown column 'ist5l_virtuemart_products.virtuemart_product_id' in 'where clause'
LIMIT 1 )

Чтобы запрос выполнялся быстро поля `virtuemart_product_id` должны быть индексируемые и одного типа и размера
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
ТС использует product_sku в новой таблице. Думаю, ему нужно что-то вроде этого:
Спойлер
[свернуть]
Но с 27000 записями такое, наверное, не пройдет. Лучше связать по virtuemart_product_id:
Спойлер
[свернуть]



Выдает ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE `ist5l_virtuemart_products_01` p1 SET p1.`virtuemart_product_id`=( SELE' at line 3
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Выдает ошибку:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATE `ist5l_virtuemart_products_01` p1 SET p1.`virtuemart_product_id`=( SELE' at line 3
Это 3 рахных запросов, а не 1.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Это 3 рахных запросов, а не 1.

Сделал 3 запроса по отдельности...
Все прошло на УРА! Без ошибок...
Но...
В ist5l_virtuemart_product_prices в столбце product_price все строки приняли значение NULL. Соответственно все цены с сайта пропали :(
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Все работает! Всем спасибо. Единственный вопрос в этом моменте:

UPDATE `ist5l_virtuemart_products_01` p1 SET p1.`virtuemart_product_id`=(
   SELECT `virtuemart_product_id` FROM `ist5l_virtuemart_products` p
   WHERE p.`product_sku`=p1.`aaa` LIMIT 1
)


кроме столбца `aaa` есть еще столбцы `bbb` и `ccc`, по которым так же нужно найти совпадения с `product_sku`
Сейчас мне пришлось сделать этот запрос 3 раза, подставляя `bbb` и `ccc`
Можно как-то сделать это в одном запросе?

Может так?:

UPDATE `ist5l_virtuemart_products_01` p1 SET p1.`virtuemart_product_id`=(
   SELECT `virtuemart_product_id` FROM `ist5l_virtuemart_products` p
        WHERE p.`product_sku`=p1.`aaa` OR p.`product_sku`=p1.`bbb` OR p.`product_sku`=p1.`aaa` LIMIT 1
)
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Похоже это был риторический вопрос  ;D

Все работает! Тема закрыта  :D :D :D
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Столкнулся со следующим...
Запрос работает с неполной таблицей...
Если загрузить все 27 тыс. позиций, то denwer не вывозит... У меня комп не такой уж мощный...
Может быть все и заработает с запросом на самом сервере... Но может существует менее ресурсоемкий запрос... Тот-же Php...

Посоветуйте  ;)
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Разбил базу на 3 части, потому что выходит ошибка time out

И по третьему запросу возвращает ошибку



SQL запрос: Документация


UPDATE `ist5l_virtuemart_product_prices` pp SET pp.`product_price`=(
        SELECT `price` FROM `ist5l_virtuemart_products_01` p1, `ist5l_virtuemart_products` p
        WHERE p.`virtuemart_product_id`=p1.`virtuemart_product_id1` AND p.`virtuemart_product_id`=pp.`virtuemart_product_id`
)


Ответ MySQL: Документация

#1242 - Subquery returns more than 1 row




В чем может быть дело?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
У вас несколько цен на один товар, что ли? Попробуйте
Код: sql
UPDATE `ist5l_virtuemart_product_prices` pp SET pp.`product_price`=(
SELECT `price` FROM `ist5l_virtuemart_products_01` p1, `ist5l_virtuemart_products` p
WHERE p.`virtuemart_product_id`=p1.`virtuemart_product_id` AND p.`virtuemart_product_id`=pp.`virtuemart_product_id`
LIMIT 1
)
, но не уверен, что не будет ошибок.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
У вас несколько цен на один товар, что ли? Попробуйте
Код: sql
UPDATE `ist5l_virtuemart_product_prices` pp SET pp.`product_price`=(
SELECT `price` FROM `ist5l_virtuemart_products_01` p1, `ist5l_virtuemart_products` p
WHERE p.`virtuemart_product_id`=p1.`virtuemart_product_id` AND p.`virtuemart_product_id`=pp.`virtuemart_product_id`
LIMIT 1
)
, но не уверен, что не будет ошибок.


Сделал немного не так...

UPDATE `ist5l_virtuemart_products_02` p1 SET p1.`virtuemart_product_id`=(
        SELECT `virtuemart_product_id` FROM `ist5l_virtuemart_products` p
        WHERE p.`product_sku`=p1.`aaa` OR p.`product_sku`=p1.`bbb` OR p.`product_sku`=p1.`ccc` LIMIT 1
)


Заработало.

Но следующем этапе выдает ошибку. Я разбил прайс на 3 таблицы 01, 02 и 03... И если я обновляю цены с каждой по отдельности, то в итоге после обновления из таблицы ist5l_virtuemart_products_03 все цены на сайте исчезают... Решил попробовать одновременно... Выдает ошибку

SQL запрос: Документация


UPDATE `ist5l_virtuemart_product_prices` pp SET pp.`product_price`=(
        SELECT `price` FROM `ist5l_virtuemart_products_01` p1, `ist5l_virtuemart_products_02` p2, `ist5l_virtuemart_products_03` p3
        WHERE pp.`virtuemart_product_id`=p1.`virtuemart_product_id` OR pp.`virtuemart_product_id`=p2.`virtuemart_product_id` OR pp.`virtuemart_product_id`=p3.`virtuemart_product_id`
)


Ответ MySQL: Документация

#1052 - Column 'price' in field list is ambiguous

*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
SELECT `price` FROM `ist5l_virtuemart_products_01` p1, `ist5l_virtuemart_products_02` p2, `ist5l_virtuemart_products_03` p3
В первых, из какой таблицы из 3 выбрать значение price?
Во вторых, предполагается, что найдется только 1 значение.
Вы должны знать кое-какие основы, так дальше я не могу вам помочь.

P.S. Сделать 3 таблицы - неправильный подход. Логичнее ограничить количество записей в запросе, ID с 0 до 7000, например.
« Последнее редактирование: 17.01.2015, 20:21:37 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Друзья, нашел php скрипт для обновления цен в магазине. Посмотрите, почему-то у меня цены не обновляются с него. Закинул на сервер таблицу csv с двумя столбцами... В общем все по инструкции. После работы скрипта все цены по нулям...

Код
<?php

$start_time = microtime(true);

$handle = fopen("katalog/ceny.csv", "r");  // Измените katalog/ceny.csv на ваш Путь и Имя файла с артикулами и новыми ценами
/*
ВНИМАНИЕ! разделитель полей |

ПРИМЕР .CSV

артикул|новая цена

00001|12
00015|35
00034|52

*/
  $dblocation = "localhost";  //замените localhost на свой адрес сервера БД
  $dbname = "name";  // измените bdname на ваше Название БД
  $dbuser = "user";  // bduser замените на ваш Логин пользователя БД
  $dbpasswd = "pass";  // Пароль пользователя БД
  $pref = "st_"; //Префикс для названия таблиц в БД

  // ДАЛЬШЕ НЕ СТОИТ ЧТО НИБУТЬ МЕНЯТЬ !

  $dbcnx = mysql_connect($dblocation, $dbuser, $dbpasswd);
  if (!$dbcnx)
  {
    echo "<p>К сожалению, не доступен сервер mySQL</p>";
    exit();
  }
  if (!mysql_select_db($dbname,$dbcnx) )
  {
    echo "<p>К сожалению, не доступна база данных</p>";
    exit();
  }
mysql_query ("set character_set_client='utf8'");
mysql_query ("set character_set_results='utf8'");
mysql_query ("set collation_connection='utf8'");


while (($data = fgetcsv($handle, 0, "|"))!== FALSE) {

    $select = mysql_query("SELECT  `virtuemart_product_id` FROM  `".$pref."virtuemart_products` WHERE  `product_sku` = '$data[0]' ");
  if(!$select)
  {
    echo '<p>Ошибка в запросе получения ID товара. Товар с артикулом '.$data[0].' в магазине не обнаружен. Пожалуйста, сначала добавьте товар (или удалите его со списка csv файла), потом пытайтесь обновить для него цену. Работа програмы была прервана.</p> ';
    exit();
  }
  $product_id = mysql_result($select,0);
  $update = mysql_query("UPDATE `".$pref."virtuemart_product_prices` SET `product_price` = '$data[1]' WHERE  `virtuemart_product_id` ='$product_id'");
  if(!$update)
  {
    echo '<p>Ошибка в обновлении цены для товара с артикулом '.$data[0].' </p>';
    exit();
  }
}

echo 'О, чудо. Всё прошло успешно!';
$exec_time = microtime(true) - $start_time;// выполнение действий
echo '<p>время исполнения'.$exec_time.'</p>';


?>
*

millioner

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Все работает)
*

nicalf

  • Захожу иногда
  • 58
  • 1 / 0
Добрый день!
Помогите, при создании нового пункта на Joomla 3 и последующем переходе по ссылке выскакивает ошибка 1064, причем старые пункты меню работают нормально, что может быть?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND c.extension = 'com_content' AND c.published = 1' at line 11 SQL=SELECT DISTINCT c.id AS CID FROM rl0zv_categories AS c LEFT JOIN rl0zv_content AS content ON c.id = content.catid WHERE 1 = 1 AND ( c.id = ) AND c.extension = 'com_content' AND c.published = 1
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
*

nicalf

  • Захожу иногда
  • 58
  • 1 / 0
AND ( c.id = )

Подскажите, что необходимо сделать? Я так понял, что это некорректная sql-конструкция, где ее найти и как исправить?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Найти можно попробовать полнотекстовым поиском по файлам какого-нибудь фрагмента запроса, когда найдете - надо сделать так чтобы значение, с которым сравнивается c.id всегда было и было числовым. например так (int)$catid, либо обернуть его кавычками, например так $db->quote($catid)
*

nicalf

  • Захожу иногда
  • 58
  • 1 / 0
Найти можно попробовать полнотекстовым поиском по файлам какого-нибудь фрагмента запроса, когда найдете - надо сделать так чтобы значение, с которым сравнивается c.id всегда было и было числовым. например так (int)$catid, либо обернуть его кавычками, например так $db->quote($catid)

Arkadiy, не могли бы Вы подробнее описать, как найти проблему, я новичек в SQL, был бы признателен Вам :)
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Подробнее врядли, я даже не знаю в каком расширении этот запрос. Найдите его и выложите как он написан в php.
*

nicalf

  • Захожу иногда
  • 58
  • 1 / 0
SELECT DISTINCT
            c.id AS CID
         
  FROM
            rl0zv_categories AS c
         
  LEFT JOIN
            rl0zv_content AS content
            
  ON
            c.id = content.catid    
         
  WHERE
            1 = 1
            
  AND ( c.id = )
            
  AND
            c.extension = 'com_content'
            
  AND
            c.published = 1
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Помогите оптимизировать getDBO запрос

Автор goga_pgasovav

Ответов: 5
Просмотров: 450
Последний ответ 10.12.2020, 12:36:56
от goga_pgasovav
[решено] создать MySQL-запрос по красоте :)

Автор effrit

Ответов: 13
Просмотров: 860
Последний ответ 30.09.2017, 16:58:21
от effrit
Запрос в бд

Автор sSeifeRr

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

Автор xak400

Ответов: 1
Просмотров: 854
Последний ответ 30.06.2017, 09:45:32
от SmokerMan
Как составить запрос с выбором данных из строки с разделителем?

Автор denism300

Ответов: 34
Просмотров: 1774
Последний ответ 20.11.2016, 21:48:07
от robert