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

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

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

 (Прочитано 1200 раз)
0 Пользователей и 1 Гость смотрят эту тему.
millioner
Захожу иногда
**

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

Сообщений: 14


« : 14.01.2015, 15:12:23 »

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

Репутация: +487/-86
Offline Offline

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


любит наш народ всякое гавно...


« Ответ #1 : 14.01.2015, 15:14:00 »

Кавычки там не такие.
Записан
evgen777
Завсегдатай
*****

Репутация: +62/-2
Offline Offline

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

skype:evgeniy8955 mail:office@sevweb.tk


« Ответ #2 : 14.01.2015, 15:15:57 »

Синтаксис запроса UPDATE посмотрите. Что у вас тут делает FROM?
Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #3 : 14.01.2015, 15:55:42 »

кавычки такие сделать? ' вместо ` ?
FROM вообще убрать?
Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #4 : 14.01.2015, 15:57:22 »

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
Профи
********

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

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


« Ответ #5 : 14.01.2015, 16:34:45 »

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

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

Сообщений: 14


« Ответ #6 : 14.01.2015, 16:49:15 »

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

Можете дать наводку?Azn
Хоть где копать?))
Записан
Arkadiy
Группа развития
*****

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

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


Крепитесь, други.


« Ответ #7 : 14.01.2015, 21:23:05 »

http://www.php.su/ здесь для начала почитайте.
Записан
Fedor Vlasenko
Профи
********

Репутация: +696/-5
Offline Offline

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


Все начинается с Value


« Ответ #8 : 14.01.2015, 23:42:20 »

Код
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` должны быть индексируемые и одного типа и размера
« Последнее редактирование: 15.01.2015, 01:40:02 от Fedor Vlasenko » Записан
robert
Профи
********

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

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


« Ответ #9 : 15.01.2015, 10:38:55 »

ТС использует product_sku в новой таблице. Думаю, ему нужно что-то вроде этого:
Показать текстовый блок
Но с 27000 записями такое, наверное, не пройдет. Лучше связать по virtuemart_product_id:
Показать текстовый блок
« Последнее редактирование: 15.01.2015, 11:23:43 от robert » Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #10 : 15.01.2015, 15:05:27 »

Код
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
Захожу иногда
**

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

Сообщений: 14


« Ответ #11 : 15.01.2015, 15:06:12 »

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

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

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


« Ответ #12 : 15.01.2015, 16:17:40 »

Выдает ошибку:
#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
Захожу иногда
**

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

Сообщений: 14


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

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

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

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

Сообщений: 14


« Ответ #14 : 15.01.2015, 17:26:12 »

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

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

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

Сообщений: 14


« Ответ #15 : 15.01.2015, 17:29:29 »

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

Все работает! Тема закрыта  Cheesy Cheesy Cheesy
Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #16 : 15.01.2015, 18:08:09 »

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

Посоветуйте  Wink
Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #17 : 17.01.2015, 17:59:57 »

Разбил базу на 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
Профи
********

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

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


« Ответ #18 : 17.01.2015, 18:10:39 »

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

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

Сообщений: 14


« Ответ #19 : 17.01.2015, 18:42:28 »

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

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

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


« Ответ #20 : 17.01.2015, 21:15:32 »

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, 21:21:37 от robert » Записан
millioner
Захожу иногда
**

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

Сообщений: 14


« Ответ #21 : 18.01.2015, 11:02:39 »

Друзья, нашел 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
Захожу иногда
**

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

Сообщений: 14


« Ответ #22 : 18.01.2015, 11:19:51 »

Все работает)
Записан
nicalf
Осваиваюсь на форуме
***

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

Сообщений: 58


« Ответ #23 : 01.09.2015, 10:06:54 »

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

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

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


Крепитесь, други.


« Ответ #24 : 01.09.2015, 10:37:37 »

AND ( c.id = )
Записан
nicalf
Осваиваюсь на форуме
***

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

Сообщений: 58


« Ответ #25 : 01.09.2015, 10:39:53 »

AND ( c.id = )

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

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

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


Крепитесь, други.


« Ответ #26 : 01.09.2015, 10:45:51 »

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

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

Сообщений: 58


« Ответ #27 : 01.09.2015, 12:23:34 »

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

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

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

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


Крепитесь, други.


« Ответ #28 : 01.09.2015, 13:10:09 »

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

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

Сообщений: 58


« Ответ #29 : 01.09.2015, 14:01:00 »

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
Записан
Страниц: [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