Код, раскидывающий результаты одной таблицы в другие по признаку

  • Автор темы BeatBox
  • Дата начала

BeatBox

Guest
Код, раскидывающий результаты одной таблицы в другие по признаку

Очень прошу помогите составить такой код:

чтобы он брал данные из таблицы
site_vote (там два поля - vote_id и vote_mark)
и раскидывал полученные данные в несколько таблиц -
site_test1
site_test2
site_test3
тоесть чтобы из таблицы site_vote значение поля vote_mark добавилось (точнее update) в табл. site_test1 где vote_id = vote_id (из таблицы site_vote).
Очень Вас прошу! я сам пробую но пока немогу понять как мне сказать скрипту выбрать все значения, а уже потом раскидывать их в таблицы, да ещё и чтобы vote_id = vote_id
 

SelenIT

IT-лунатик :)
BeatBox

А для чего понадобилось раскидывать на несколько таблиц? В чем состоит конечная задача?
 

BeatBox

Guest
задача - в таблицу site_vote записываються результаты голосования, и каждый час код, который я очень надеюсь мне помогут создать, будет раскидывать резуьтаты в таблицы конкретных разделов сайта. Тоесть с нескольких разделов сайта люди могу голосовать за одно и тоже (один и тот же обьект голосования). А раскидывать нужно что бы выводить результат голосования в каждом разделе, не создавая лишних запросов (тоесть если бы я делал сразу запись голосов и подсчет результатов). Очень прошу - помогите.
 

SelenIT

IT-лунатик :)
1) неужели голосов так много, что запрос из основной таблицы всего за час уже станет проблемой?
2) если в таблице site_vote всего два поля, причем первое (как я понял) - id объекта голосования, а второе - (опять же как я понял) - число голосов, то на основании чего будет определяться, что в какой раздел заносить?
3) Таблицы site_test1, site_test2, site_test3 - одинаковой структуры или разной? Если одинаковой - не проще ли во всех отношениях держать одну таблицу с дополнительным полем "id раздела"?
 

BeatBox

Guest
Извините, я просто настолько расстроен, что ничего неполучаеться, поэтому плохо обьяснил. Сейчас обьясню точнее.
На скриншоте 1 показал структуру таблицы, из которой нужно брать данные:

Из этой таблицы нужно брать данные vote_mark, и вставлять их в таблицу номер2 (ниже), в поле igm, где game_id=vote_id


и по такому же принципу, чтобы вставляло данные ещё в пару таблиц, тоже в поле igm, где game_id=vote_id.
 

BeatBox

Guest
Дополню
Извините что я сразу не сказал - забылся.
Вставлять нужно не конкретное значение, а вывести результат по форумел (уже готовой):
вот код, который просчитывает результат (его и нужно вставить в таблицу site_test1 в строку igm с полем game_id равным vote_id.
код:
PHP:
 $sql = "SELECT vote_mark FROM ".$prefix."_vote WHERE vote_id='$game_id' AND vote_act='game'";

$result2 = $db->sql_query($sql);
$numrows = $db->sql_numrows($result2);

while($rowvote2 = $db->sql_fetchrow($result2)){
$optionCount = $rowvote2['vote_mark'];
$sum = (int)$sum + $optionCount;
}
$percent = $sum / $numrows;
$percent2 = (int)$percent;
тоестьв конечном итогу вставляем мы $percent2

-~{}~ 06.03.05 21:25:

Автор оригинала: SelenIT
У меня по обеим ссылкам - ошибка 404
может как раз сервер хостинга перегружали? но вот вообщем я сделал зеркала скриншотов:
http://coolsurf.narod.ru/1.JPG
http://coolsurf.narod.ru/2.JPG

-~{}~ 06.03.05 21:37:

я например немогу понять, как мне сделать select из базы с таблицы site_vote, выводя результаты по форуе:
PHP:
$sql = "SELECT vote_mark FROM ".$prefix."_vote where";

$result2 = $db->sql_query($sql);
$numrows = $db->sql_numrows($result2);

while($rowvote2 = $db->sql_fetchrow($result2)){
$optionCount = $rowvote2['vote_mark'];
$sum = (int)$sum + $optionCount;
}
$percent = $sum / $numrows;
$percent2 = (int)$percent;
echo "$percent2";
тоесть всё время выводит результат только одного голосования, а как сделать чтоб он вывел сначала результат одного, записал его значение другую таблицу. Потом чтобы вывел результат другого голосования, потом третьего. Или это невозможно?
 

SelenIT

IT-лунатик :)
BeatBox
давай соберись, и изложи следующие факты:

1) Опиши структуру таблицы site_vote. Можешь показать результат show_create_table и обязательно поясни, что означает каждое поле и какого вида данные там обычно хранятся.
2) То же самое, но для таблицы site_test1.
3) Объясни, чем различаются таблицы site_test1, site_test2, site_test3.

Интуитивно чувствую, что у твоей задачи есть более простое решение...
 

BeatBox

Guest
site_vote:
vote_act - (varchar 255) - используеться в скрипте отдачи голоса. Тут указываеться за что голосуют - за игру или за файл\программу.
vote_mark (int(3)) - сюда записываються голоса во время отдачи голоса.
vote_id (varchar(255)) - сюда записываеться, за что конкретно проголосовали (id игры или программы береться с странички, откуда голсуют).
user_voted (varchar(255) ) - сюда вписываеться имя пользователя, который отдал голос.

Стрункута site_test1 и прочих - там порядка 40-50 полей. Это таблицы разделов сайта (Рецензии, игры, демо-версии, статьи и прочее). Описать структуру - нереально долго. Единственные поля, которые задействуться при работе будущего скрипта - это поле
game_id (varchar 255) - именно его значение при голосовании записываеться в site_vote. И поле igm - сюда как раз и нужно записывать результат, высчитанный будущим скрптом по формуле, приведенной выше.

отличие таблиц site_test1, site_test2, site_test3 - сдержание. Это таблицы разных модулей(разделов) сайта.

-~{}~ 06.03.05 21:55:

структуа site_vote
----------------------------
CREATE TABLE site_vote (
vote_act varchar(255) NOT NULL default '',
vote_mark int(3) NOT NULL default '0',
vote_id varchar(255) NOT NULL default '0',
user_voted varchar(255) NOT NULL default ''
) TYPE=MyISAM;
----------------------------
 

SelenIT

IT-лунатик :)
Мда, сколько сложностей...
Так тебе нужно всего навсего получить среднее значение vote_mark для каждой игры? Изучай возможности MySQL: Функции, используемые в операторах GROUP BY
PHP:
$sql = "SELECT vote_id, AVG(vote_mark) AS percent FROM ".$prefix."_vote WHERE vote_act='game' GROUP BY vote_id ORDER BY vote_id";
$result2 = $db->sql_query($sql);
$percent2 = array();
while($rowvote2 = $db->sql_fetchrow($result2)){
$percent2[$rowvote2['vote_id']] = round($rowvote2['percent']);
}
На выходе получишь готовый массив "vote_id => округленное среднее значение vote_mark". Делай с ним что хочешь)
 

uchenik

Новичок
У тебя неправильно организовано хранение данных.
Абсолютно все нужно перепроектировать и переписать!

Типы столбцов подобраны ужасно.

Я так понимаю, что ты не знаешь что такое "обьединения", иначе идея разбрасывания по таблицам результатов голосования не возникла.

Тебе обязательно нужно почитать про:

1. Типы данных столбцов
2. Обьединения

Если нет книги, то почитать можно здесь:

http://dev.mysql.com/doc/mysql/ru/index.html
 

BeatBox

Guest
да. Но ведь это будет оценка одной игры, а мне нужно оценку каждой игры записать в таблицы site_test в поле igm где game_id=vote_id
 

SelenIT

IT-лунатик :)
BeatBox
Это будет массив оценок каждой игры. Сделай в моем примере print_r($percent2) и убедись.

А по организации хранения данных - прислушайся к словам uchenikа. Хранить все в куче вообще неправильно, а идея каждый час апдейтить кучу таблиц с кучей полей переменной длины по пустякам слабо вяжется со здравой идеей оперировать данными
не создавая лишних запросов
 

BeatBox

Guest
SelenIT спасибо. А как сделать чтобы теперь эти результаты разбрасывало по нужным мне аблица, подскажите пожалуйста.
uchenik спасибо за ссылочку и совет, но я немогу найти там инфориации по обьеденению. Может я что-то не атк понял

-~{}~ 06.03.05 22:51:

вот сделал запрос, и получил:
Array ( [flat] => 80 [id23] => 10 [testgame001] => 40 )

как теперь сделать чтобы в таблицу site_test1
записались данные:
80 в поле igm где game_id=flat
10 в поле igm где game_id=id23
40 в поле igm где game_id=testgame001
помогите пожалуйста
 

CDParker

Guest
Даров BeatBox, чё таки решыл на этот форум прийти по моему совету, надеюсь ты меня узнал ато я тут не под своим ником. Я тебе там,у михи на сайте ;) уже написал.

Как тебе такой код:
PHP:
$take=mysql_query("SELECT vote_id, vote_mark FROM nuke_vote"); 
while($row=mysql_fetch_assoc($take){ 
$vote_id=$row[vote_id]; 
$vote_mark =$row[vote_mark]; 
$update=mysql_query("UPDATE nuke_test1 SET vote_mark=$vote_mark WHERE vote_id=$vote_id"); 
echo "<br>Данные для vote_id=$vote_id занесены в nuke_test1"; 
$update=mysql_query("UPDATE nuke_test2 SET vote_mark=$vote_mark 
WHERE vote_id=$vote_id"); 
echo "<br>Данные для vote_id=$vote_id занесены в nuke_test2"; 
$update=mysql_query("UPDATE nuke_test3 SET vote_mark=$vote_mark WHERE vote_id=$vote_id"); 
echo "<br>Данные для vote_id=$vote_id занесены в nuke_test3"; 
}
 

SelenIT

IT-лунатик :)
CDParker
поставь для начала error_reporting(E_ALL) и проверь свой код. А то ведь и правда демоны забанят :)
 

uchenik

Новичок
BeatBox
Не нужно ничего разбрасывать по таблицам!
При правильной организации данных вся статистика голосования возвращается одним запросом.

Думать далее над тем, как раскинуть данные по таблицам - это бесполезный труд, потому что ВСЯ база данных спроектирована УЖАСНО и тебе все-равно придется всё ПЕРЕДЕЛЫВАТЬ. Причина ошибок - недостаток знаний.

Лучше всего купить книгу по MySQL (рекомендую Поль Дюбуа "MySQL"), чтобы понять что такое реляционная база данных и какие у нее возможности.

Можно, конечно, почитать статейки на:

http://detail.phpclub.ru/
http://www.phpfaq.ru/

но без нормальной книги никак.
 

BeatBox

Guest
CDParker
СПАСИБО! КАК РАЗ ТО О ЧЕМ Я И ГОВОРИЛ! вот код тот что ты дал, исправленный :
PHP:
$take=mysql_query("SELECT vote_id, vote_mark FROM nuke_vote");
while($row=mysql_fetch_assoc($take)) {
$vote_id=$row[vote_id];
$vote_mark =$row[vote_mark];
$update=mysql_query("UPDATE nuke_games SET igm='$vote_mark' WHERE game_id='$vote_id'");
echo "<br>&#196;&#224;&#237;&#237;&#251;&#229; &#228;&#235;&#255; vote_id=$vote_id &#231;&#224;&#237;&#229;&#241;&#229;&#237;&#251; &#226; nuke_test1";
Единственное что - буду благодарен если подскажете, как сделать что бы он пихал не последние только последние данные а общее (среднее).
Форуму я выше писал. сам немогу :(

-~{}~ 06.03.05 23:50:

uchenik
честно говоря я ненмного несогласен. Дело в том что у меня уже есть рабочая версия этого же голосования, где все данные храняться в одной таблице а результат выводиться в каждом отдельном модуле (даже разбил результат на "мнение пльзователей" и мнение администрации.). На самом деле мне этот разброс необходим для того, чтобы можно было при выборе сортировки статей отображать их по кол-ву голосов как с одной стороны так и с другой.
А если сама статья храниться в таблице site_article, то как же я смогу вывести последние 20 статей, и сдеать order by mark (оценка) если самы данные об оценке храняться в другой таблице.
я незнаю.
Если бы кто-то смог мне сказать как - я бы не страдал этим разбросом и не сучал бы других, но пока что все кого я спрашивал неотвечали. Правда я ещё на этом форуме не спрашивал ;)
 

uchenik

Новичок
BeatBox
И не ответят, потому что простого ответа здесь быть не может.

Тебе нужно заново проектировать всю БД, чтобы не было дублирования данных и таких хитрых трехэтажных решений на примере последнего. Реализуется это с помощью правильного проектирования СВЯЗЕЙ между таблицами и запросов с использованием ОБЬЕДИНЕНИЙ.

Что это такое раскажет ХОРОШАЯ КНИГА. Рекомендую книгу Дюбуа, в которой много отличных примеров и все подробно расписано.

После прочтения первых глав ты поймешь насколько сложно и запутанно построил свою систему.

Так что дерзай!
 
Сверху