Помогите плиз с запросами
1.
Дмитрий (10.07.2010 / 20:03)
Вообщем делаю голосование за фотку, но чтобы можна было оставлять +1 или +3 (для начала
) столкнулся с проблемой вывода, сколько поставил юзер, +1 или +3.
Точнее, делаю так:
<?
$q = mysql_query("SELECT * FROM `users` WHERE `id`='{$nk}';");
$data = mysql_fetch_array($q);
$counter = $data['votefoto']; // само поле фото
$login = $data['user'];
$counter2 = $counter + 1; // + 1 голос
// тут запрос на запись в бд
mysql_query ("UPDATE `users` SET `cols`=`cols`+'1', `votefoto`='{$counter2}' WHERE `id`='{$nk}';");
mysql_query ("INSERT INTO `golos` SET `user`='{$nk}', who='{$id}'");
// ок...
echo 'Голос принят!<br/>';
// далее...
$q = mysql_query("SELECT * FROM `users` WHERE `id`='{$nk}';");
$data = mysql_fetch_array($q);
$counter = $data['votefoto']; // само поле фото
$login = $data['user'];
$counter2 = $counter + 3; // + 3 голоса
// тут запрос на запись в бд
mysql_query ("UPDATE `users` SET `cols`=`cols`+'3', `votefoto`='{$counter2}' WHERE `id`='{$nk}';");
mysql_query ("INSERT INTO `golos` SET `user`='{$nk}', who='{$id}'");
// ок...
echo 'Голос принят!<br/>';
// ЗЫ спецом создал поле `cols`
// потом вывожу у юзера
$goloscol = mysql_result(mysql_query("SELECT `cols` FROM `users` WHERE `id` = '".$id."';"), 0);
echo 'Кто голосовал: ' . $login . $goloscol;
?>
Теперь проблема заключается в том, что если я допустим проголосую +1 - ему выводить будет "юзер такой то +1", если после проголосую +3, уже не будет выводить "юзер +1, юзер2 +3" будет выводить "юзер +4, юзер2 +4"
надеюсь ясно описал суть
2.
shurik (10.07.2010 / 20:28)
тоесть тебе нужно сосчитать сколько голосов отдал каждый пользователь по отдельности?
3.
Дмитрий (10.07.2010 / 20:44)
Да, а то у меня выходит рядом с ником голосовавшего общее количество, а мне нужно вывести отдельно кто сколько дал
4.
Олег (10.07.2010 / 22:10)
Не совсем ясно, код грязный и судя повсему отношения между таблицами неверные. Опиши структуру БД.
5.
Александр (10.07.2010 / 23:52)
этот код можно сократить в 3 раза
6.
Дмитрий (10.07.2010 / 23:57)
#4 что там описывать, есть таблица юзеров `users` в ней колонка `votefoto` в которой содержытся количество голосов, я добавлял еще `cols`
#5 ну напиши свой сокращенный пример
7.
Богдан (11.07.2010 / 04:26)
<?
if(!empty($_GET['vote'])){
$vote = intval($_GET['vote']);
if($vote<=3 && $vote>=1){
$q = mysql_query("SELECT * FROM `users` WHERE `id`='{$nk}';");
$data = mysql_fetch_array($q);
$counter = $data['votefoto']; // само поле фото
$login = $data['user'];
$counter2 = $counter + $vote; // + 1 голос
// тут запрос на запись в бд
mysql_query ("UPDATE `users` SET `cols`=`cols`+'$vote', `votefoto`='{$counter2}' WHERE `id`='{$nk}';");
mysql_query ("INSERT INTO `golos` SET `user`='{$nk}', who='{$id}'");
// ЗЫ спецом создал поле `cols`
// потом вывожу у юзера
$goloscol = mysql_result(mysql_query("SELECT `cols` FROM `users` WHERE `id` = '".$id."';"), 0);
echo 'Кто голосовал: ' . $login . ' +' . $vote;
// ок...
echo 'Голос принят!<br/>';
} else {
die('error');
}
}
?>
Не совсем правда понял логику твого кода...но если ты хочеш предупредить юзера о том что голосовали за его фотку делай просто в конце отправку ЛС c количеством балов и пользователем который проголосовал.
8.
Дмитрий (11.07.2010 / 07:29)
Та нее, отправку ЛС я сделал, тут другое, кароч юзверь смотреть может кто отдал за него голос, но там выводит только ники, а я хотел чтобы выводило ник и сколько он дал голоса. Ну например:
[b]Кто голосовал за меня[/b]
Вася +1
Петя +3
Галя -5
типа этого
9.
Александр (11.07.2010 / 13:03)
if($vote<=3 && $vote>=1){ замени на if($vote<=-5 && $vote>=5){ для начала.
судя по названию твоей таблицы users, тебе придётся создать ещё 1 таблицу golosa.
|id|кто голосовал|за кого|оценка|
дальше сам)
10.
Олег (11.07.2010 / 14:51)
Фотография всего лишь одна у пользователя или множество? Если второе, то нужно в таблице golosa (я бы на твоем месте таблицу golosa переименовал в voting) сделать поле id_image.
И еще какая максимальная/минимальная оценка за фотографию для каждого пользователя?
11.
Дмитрий (11.07.2010 / 17:56)
Aligan фотка одна, я доделал голоса +1 +3 +5 -1 -3 -5
12.
Олег (11.07.2010 / 21:10)
Mr-General, структуру таблиц ты так и не привел здесь.
13.
Славик (12.07.2010 / 01:32)
Вопрос к автору зачем один и тотже пользователь буит по 50 раз за одну и туже фотку голосовать??? а так пиши как новую запись
|id|id_img|iduz|col
тоесть
|1|123|999|1
|2|123|999|3
|3|123|999|-5
так помойму проще)))
14.
Андрюха (12.07.2010 / 02:33)
13. Например для поднятия себя в рейтинге
15.
Дмитрий (12.07.2010 / 06:58)
#13 юзверь может только один раз голосовать, только один раз выбрать + или - столько-то... проблема в другом. Aligan структура чего тебе нужна? там же всего одна колонка votefoto хотя еще табличка
<?
CREATE TABLE `golos` (
`id` int(11) NOT NULL auto_increment,
`user` int(11) NOT NULL default '0',
`who` int(11) NOT NULL default '0',
`ip` varchar(20) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
?>
16.
Олег (13.07.2010 / 13:35)
А суть проблемы в чем? Чтобы определить сколько конкртеный пользователь оставил голосов?
17.
Дмитрий (14.07.2010 / 20:22)
Да да
18.
Олег (15.07.2010 / 06:06)
Так в чем проблема. Если ты в поле записываешь уже нужное кол-во голосов для этой фотки конкретного пользователя, то какая проблема с выводом голосов?
Или ты хочешь вывести всех пользоватлей проголосовавших заданную фотку? Если да, то можно группирующим запросом сделать
19.
Саня (15.07.2010 / 06:37)
SELECT * FROM ... GROUP BY who
Если правельно понял
))
20.
Олег (15.07.2010 / 06:54)
Только еще JOIN'ом нужно подхватить таблицу юзеров.
21.
Саня (15.07.2010 / 08:47)
20, лучше без них, чтал что условия в ON систему тормозят, можна и без них обойтись, если бы до конца вкуривал че автору надо, написал бы ему запрос
22.
Дмитрий (15.07.2010 / 10:07)
Aligan, ВСЕ юзеры голосовавшие за мою фотку и так у меня выводятся (их ники). А мне надо , чтобы возле их ников (голосовавших), было еще и количество голосов видно, тоесть кто скока дал ёмаё
23.
Саня (15.07.2010 / 10:44)
Фухх, разобрался в коде,1, выводит 4 потому что ты -/+ от поля cols, создай поле в golos и пиши туда +3,-2,+1 и т.д., тогда и подщет норм будет
24.
Олег (15.07.2010 / 13:42)
21, забудь что ты читал... по-твоему лучше тогда делать еще один запрос в цикле на извлечение данных из связной таблицы? Это действительно тормознуто.
Mr-General, тогда какие проблемы? Выводи переменную, никаких дополнительных расчетов не нужно.
25.
Дмитрий (16.07.2010 / 01:19)
Aligan (15 Июля 2010 / 13:42)
21, забудь что ты читал... по-твоему лучше тогда делать еще один запрос в цикле на извлечение данных из связной таблицы? Это действительно тормознуто.
Mr-General, тогда какие проблемы? Выводи переменную, никаких дополнительных расчетов не нужно.
дак в этом и проблема че то не доходит как вывести
26.
Олег (16.07.2010 / 02:18)
В твоем первом посте, в листинге вообще нету никакого цикличиского вывода, что как бы говорит о том что ты выводишь не всех пользователей голосовавших за фотку, а одного конкретного.
p.s Если у тебя проблема в последних строках, то замени на
$goloscol = mysql_result(mysql_query("SELECT `cols` FROM `users` WHERE `id` = '".$id."';"), 0,"cols");
echo 'Кто голосовал: ' . $login . $goloscol;
27.
Дмитрий (16.07.2010 / 04:50)
Ну вот эта фишка которая выводит все ники(только ники) голосовавших
<?
if (empty($page)) $page = 0;
$query = mysql_query("select * from golos where user='".$id."';");
$num_of_rows = mysql_num_rows($query);
$total_mat_number = $num_of_rows;
$max = 10;
$total_pages=ceil($total_mat_number/$max);
$print = mysql_query("select * from golos where user='".$id."' order by who desc limit ".$page.",".($max).";");
$i = 1+$page;
while($arr = mysql_fetch_array($print)) {
$usid = $arr['who'];
$whogolos = mysql_query("select user from users where id=".$usid.";");
$idatas = mysql_fetch_array($whogolos);
$login = $idatas['user'];
echo $fsize1;
echo ($i++).') <a href="search.php?go=view&$ses&nick=$usid">'.$login.'</a><br/>';
28.
Олег (16.07.2010 / 12:20)
Ну так у тебя как я понял голос хранится в cols?
Тогда
<?
if (empty($page)) $page = 0;
$query = mysql_query("select * from golos where user='".$id."';");
$num_of_rows = mysql_num_rows($query);
$total_mat_number = $num_of_rows;
$max = 10;
$total_pages=ceil($total_mat_number/$max);
$print = mysql_query("select * from golos where user='".$id."' order by who desc limit ".$page.",".($max).";");
$i = 1+$page;
while($arr = mysql_fetch_array($print))
{
$usid = $arr['who'];
// его голос
$vote = $arr['cols'];
$whogolos = mysql_query("select user from users where id=".$usid.";");
$idatas = mysql_fetch_array($whogolos);
$login = $idatas['user'];
echo $fsize1;
echo ($i++).') <a href="search.php?go=view&$ses&nick=$usid">'.$login.'</a> Дал оценку '.$vote.'<br/>';
}?>
29.
Олег (16.07.2010 / 12:22)
Вообще твой код убийственный по отношению к MySQL серверу, всамом деле. Каждая новая итерация цикла новый запрос. Чем больше проголосовало тем больше запросов к БД.
URL:
https://visavi.net/topics/11414