Консультация № 182696
02.04.2011, 13:39
113.62 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Мне нужно изменить (обновить) данные в двух полях в одной таблице базы данных MySql. Причина в том, что старые данные не были удалены. В данный момент удалять эти данные полностью нет смысла, потому что идет обновление данных и к старым данным добавляются новые. Новые данные мне удается получить скриптом. Остается только внести их в нужные поля одной таблицы. Желательно делать это сразу моим же скриптом, после получения значения.
Исходные данные (многие исходные данные представлены в виде переменных. В таком виде их и нужно использовать):
1. База данных - $db;
2. Номер категории - $min_categoryID;
3. Количество записей - $next_links, они соответствуют разным номерам категорий и могут отличаться друг от друга;
Задача: Нужно обновить данные в таблице: categories в полях: products_count и products_count_admin, записав туда одинаковые для каждой строки данные $next_links, где поле categoryID соответствует $min_categoryID.
Продолжите или исправьте эту запись: $result = mysql_query(UPDATE categories SET product_count, product_count_admin и т.д. Дальше я просто не понял что писать. Мне нужна просто грамотно написанная строка запроса.
И второй момент: мне нужно посчитать сколько общее количество записей при сложении всех $next_links. Мне нужно сложить количество записей - $next_links во всех категориях - $min_categoryID и отобразить полученное число с помощью echo. Я их получаю циклом:
$min_categoryID = $min_categoryID + 1;
while (($min_categoryID) <= $max_categoryID)
{
// Здесь тело цикла, где в каждой категории я получаю количество записей - $next_links.
$min_categoryID++;
}
Так как практически здесь 2 вопроса, соответственно и сумма оплаты немного выше.
Заранее благодарю за ответ.

Обсуждение

давно
Старший Модератор
312929
1973
03.04.2011, 05:39
общий
это ответ
Здравствуйте, rock!

Насколько я понял, вам нужно выполнить две операции для таблицы categories:

1) Для записи с categoryID = $min_categoryID обновить поля products_count и products_count_admin, записав туда значение $next_links.

2) Для записей с $min_categoryID < categoryID <= $max_categoryID найти сумму значений поля products_count, в которое заносились $next_links.

Для первой операции выполняем следующий запрос:
Код:

$result = mysql_query("UPDATE categories SET product_count = '$next_links', product_count_admin = '$next_links' WHERE categoryID = '$min_categoryID' ");

Для второй можно вместо цикла использовать запрос с агрегатной функцией SUM:
Код:

list($sum) = mysql_fetch_array(mysql_query("SELECT SUM(products_count) FROM categories WHERE categoryID>'$min_categoryID' AND categoryID<='$max_categoryID' "), MYSQL_NUM);
echo $sum;

Если я что-то понял неправильно, уточните в минифоруме.
5
Большое спасибо Жерару! Он меня выручает уже не первый раз. Всем рекомендую обращаться к нему за помощью.
Неизвестный
03.04.2011, 10:55
общий
Адресаты:
Первая часть отлично. Со второй не получается. Дело в том, что сумма всех строк во всех категориях будет помещаться в первую категорию, это главная категория (изменять номер которой нельзя). Категории из которых я получаю строки, начинаются с 4, потому что это подкатегории. А list, я посмотрел мануал, работает, где нумерация начинается с 0. Результата просто нет. Пробовал без list ответ: array. Пробовал заменить на string, тоже нет результата. Может все - таки проще сложить сумму данных полученных циклом? Еще один момент, может поможет: все данные я беру из другой таблицы. Там описание строк и номер к какой категории каждая строка относится. Я их собираю циклом (количество), про который говорил и добавляю к таблице: categories. А может просто собрать количество всех записей из той таблицы?
давно
Старший Модератор
312929
1973
03.04.2011, 14:40
общий
То есть у Вас две таблицы. А нельзя ли подробнее описать, какие данные хранятся в той и другой, и что вы с ними делаете?
Неизвестный
03.04.2011, 15:38
общий
Можно. В одной таблице хранится описание товара. Каждый товар имеет уникальный номер для базы данных - productID. Во второй таблице этот каждый уникальный номер привязывается к номеру подкатегории - categoryID, в которой он должен отображаться на сайте. А в третьей (categories) находятся номера подкатегорий, привязанные к номерам категорий, количество товаров и прочая статистика. В ней же отображается количество товаров в каждой подкатегории и категории. Я работая со второй таблицей, циклом пересчитываю количество товаров в каждой подкатегории и вставляю в третью таблицу подсчитанное количество. Про первую таблицу упомянул, чтобы была понятней логика размещения. Эту задачу Вы и решили в первом ответе. Но есть главная категория, в которой должно отображаться общее количество всех товаров. Что мне и нужно сделать. Любое изменение этой категории, типа изменить номер, переименовать приводит к отказу движка сайта. Поэтому она строго первая.
давно
Старший Модератор
312929
1973
03.04.2011, 20:45
общий
08.10.2015, 16:08
Теперь понятно: в первой таблице - товары с уникальными productID, в третьей - категории с уникальными categoryID, а вторая обеспечивает связь между ними. Единственный не до конца понятный момент - насчет категорий и подкатегорий. Как я понял, есть главная категория (одна), под ней - несколько категорий, а под каждой из них могут быть свои подкатегории (как бы категории второго уровня). И нужно подсчитать общее количество товаров по всем категориям и подкатегориям, кроме главной? Или только по подкатегориям (и как в этом случае определить, с какого categoryID начинаются подкатегории)?

Если по всем категориям, то действительно, можно взять количество записей во второй таблице. Быстрее всего так:
Код:

list($num) = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM имя_таблицы_2"), MYSQL_NUM);
echo $num;

а затем вставить в третью таблицу, примерно так:
Код:

mysql_query("UPDATE categories SET product_count = '$num', product_count_admin = '$num' WHERE categoryID = 'номер_главной_категории' ")

Если только по подкатегориям с номерами от $min_categoryID до $max_categoryID, то первый запрос немного изменится:
Код:

list($num) = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM имя_таблицы_2 WHERE categoryID>'$min_categoryID' AND categoryID<='$max_categoryID' "), MYSQL_NUM);

Кстати, первую задачу, на мой взгляд, тоже можно решить быстрее, используя запросы с COUNT, примерно так:
Код:

$result = mysql_query("SELECT categoryID, COUNT(*) AS next_links FROM имя_таблицы_2 GROUP BY categoryID");
while(list($categoryID, $next_links) = mysql_fetch_array($result, MYSQL_NUM))
mysql_query("UPDATE categories SET product_count = '$next_links', product_count_admin = '$next_links' WHERE categoryID='$categoryID' ");

Неизвестный
04.04.2011, 15:13
общий
Адресаты:
Вы проигнорировали то, что я написал ранее. Конструкции с использованием list у меня не работают. Остальной код из-за этого не имеет смысла. Может я что-то не вижу, проверьте этот код:
list($sum) = mysql_fetch_array(mysql_query("SELECT SUM(products_count) FROM categories WHERE categoryID > '$min_categoryID' AND categoryID <= '$max_categoryID' "));
echo $sum.'
';
В результате я не получаю ничего, даже сообщения об ошибке. У меня редактор кода phpdesigner7 лицензионный и все настроенные сервера, дома и на сервере. На сервере, естественно не мной. Скрипт запускал и с домашнего компьютера и с сервера.
С Вашим предположением насчет категорий и подкатегорий я согласен, я заметил это мое упущение, когда отобразил количество товаров на главной странице сайта. Но вопрос с суммированием товаров в главной категории так и не решился. Если здесь будет решение, то и с остальными категориями я разберусь по аналогии.
давно
Старший Модератор
312929
1973
04.04.2011, 17:10
общий
А list не работает вообще или только в сочетании с функциями типа mysql_fetch_array? Впрочем, Вы упоминали, что без list возвращается array, значит эта функция работает (иначе бы возвращала FALSE). Тогда можно обойтись без list (он, в принципе, нужен только для упрощения кода). Например, так:
Код:

$row = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM имя_таблицы_2"), MYSQL_NUM);
echo $row[0];

В цикле тоже можно обойтись без list:
Код:

$result = mysql_query("SELECT categoryID, COUNT(*) AS next_links FROM имя_таблицы_2 GROUP BY categoryID");
while($row = mysql_fetch_array($result, MYSQL_NUM))
mysql_query("UPDATE categories SET product_count = '$row[1]', product_count_admin = '$row[1]' WHERE categoryID='$row[0]' ");

Второй параметр MYSQL_NUM в mysql_fetch_array означает, что возвращается массив с обычными числовыми индексами (0 - первое поле в запросе SELECT, 1 - второе и т.д., всего будет столько элементов, сколько полей указано в запросе).
Неизвестный
05.04.2011, 16:35
общий
Адресаты:
Здравствуйте! Я понял, точнее вспомнил, в чем проблема с запросами к Mysql. В свое время я не смог установить новую версию движка сайта, ребята из техподдержки движка тоже не смогли. Но они мне сказали, что на сервере неправильно настроен MySql. После обращения в тех.поддержку хостинга, не без того, что я уже сообщил им, что ухожу, они сами установили мой движок. Причину, почему невозможно было установить без них, не сообщили. Видимо эта проблема осталась. Кроме того, создавая запросы к MySql, я изменяю синтаксис в запросах, тоже в свое время помучился, прежде чем нашел в интернете нужное решение. Вот пример изменения: Вы пишете переменную в одинарных кавычках, а я в двойных и еще и точками окружаю переменную: ".$row.". Только в таком виде сервер принимает переменную в теле MySql - запроса. По всей видимости такие слова, как list, наверное тоже нужно оформлять нестандартно. До выходных я не смогу заниматься программированием, просто нет возможности. А Ваш ответ я признаю правильным, дополнительно спасибо за отдельные советы. Оценка - 5.
Форма ответа