Помогите плиз с запросами

1. Дмитрий (10.07.2010 / 20:03)
Вообщем делаю голосование за фотку, но чтобы можна было оставлять +1 или +3 (для начала smile ) столкнулся с проблемой вывода, сколько поставил юзер, +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" smile надеюсь ясно описал суть

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
Если правельно понялsmile ))

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&amp;$ses&amp;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&amp;$ses&amp;nick=$usid">'.$login.'</a> Дал оценку '.$vote.'<br/>';  
}?>


29. Олег (16.07.2010 / 12:22)
Вообще твой код убийственный по отношению к MySQL серверу, всамом деле. Каждая новая итерация цикла новый запрос. Чем больше проголосовало тем больше запросов к БД.

URL: https://visavi.net/topics/11414