Друзья, в чем может быть дело? SQL-запрос в phpMyAdmin

  • 37 Ответов
  • 1731 Просмотров

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

В общем, есть оптовый прайс поставщика который меняется каждую неделю. 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

  • ********
  • 9334
  • [+]520 / [-]101
  • СКАЙП утерян! Пишите в телеграм @volandku
    • Просмотр профиля
    • webstudio.pro

*

Оффлайн evgen777

  • *****
  • 667
  • [+]62 / [-]2
  • skype:evgeniy8955 mail:office@sevweb.tk
    • Просмотр профиля
Синтаксис запроса UPDATE посмотрите. Что у вас тут делает FROM?
Разработка, доработка расширений для Joomla!
Рекомендую доступные VPS для Joomla

кавычки такие сделать? ' вместо ` ?
FROM вообще убрать?

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

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

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

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

*

Оффлайн Arkadiy

  • *****
  • 5340
  • [+]440 / [-]0
  • Крепитесь, други.
    • Просмотр профиля
    • http://argens.ru

*

Оффлайн Fedor Vlasenko

  • ********
  • 3799
  • [+]704 / [-]6
  • Все начинается с Value
    • Просмотр профиля
    • Создание сайтов, поддержка сайтов
Код: (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

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

Код: (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` должны быть индексируемые и одного типа и размера

ТС использует 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

Выдает ошибку:
#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.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

Это 3 рахных запросов, а не 1.

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

Все работает! Всем спасибо. Единственный вопрос в этом моменте:

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
)

Похоже это был риторический вопрос  ;D

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

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

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

Разбил базу на 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

У вас несколько цен на один товар, что ли? Попробуйте
Код: (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
)
, но не уверен, что не будет ошибок.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

У вас несколько цен на один товар, что ли? Попробуйте
Код: (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

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, 22:21:37 от robert »
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

Друзья, нашел 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($handle0"|"))!== 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>';


?>

Все работает)

*

Оффлайн nicalf

Добрый день!
Помогите, при создании нового пункта на 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


*

Оффлайн nicalf

AND ( c.id = )

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

*

Оффлайн Arkadiy

  • *****
  • 5340
  • [+]440 / [-]0
  • Крепитесь, други.
    • Просмотр профиля
    • http://argens.ru
Найти можно попробовать полнотекстовым поиском по файлам какого-нибудь фрагмента запроса, когда найдете - надо сделать так чтобы значение, с которым сравнивается c.id всегда было и было числовым. например так (int)$catid, либо обернуть его кавычками, например так $db->quote($catid)

*

Оффлайн nicalf

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

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

*

Оффлайн Arkadiy

  • *****
  • 5340
  • [+]440 / [-]0
  • Крепитесь, други.
    • Просмотр профиля
    • http://argens.ru
Подробнее врядли, я даже не знаю в каком расширении этот запрос. Найдите его и выложите как он написан в php.

*

Оффлайн nicalf

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