 
			
				20.03.2010, 00:19
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 20.11.2009 
					
					
					
						Сообщений: 257
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				rand в php два рендома друг с другом связаны
			 
			
		
		
		
		Как сделать так, чтобы $rnd2 не учитывало $rnd? Тоесть чтобы $rnd никогда не было равно $rnd2.   
$kol = mysql_num_rows(mysql_query("SELECT * FROM writers"));
$rnd = rand(1, $kol);
$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd."'"));
$rnd2 = rand(1, $kol);
$db2 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd2."'"));
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 00:33
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		да тысяча способов. 
while( ($rnd2 = rand(1, $kol)) ==$rnd);
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 00:53
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Пионэр 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 1,322
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Гхм… Если Вам нужно две различные случайные строки из таблицы, то так и составляйте запрос: 
	
 
	| 
		 Код: 
	 | 
 
	SELECT * FROM `writers` ORDER BY RAND() LIMIT 2  | 
 
	
 
 
UPD: Надеюсь, столбец id хотя бы уникальный?  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось subzey, 20.03.2010 в 00:56.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 01:23
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		subzey, 
 вы в своем уме? 
сложность вычислений при таком запросе O(N*lg(N)) 
и все это ради двух строчек. 
В то время, как способ  Jekel делает это за O(lg(N)) 
Разницу чуствуете? 
PS  Вспомнилось 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 01:45
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Пионэр 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 1,322
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Gvozd, 
вроде, пока да. На стенде, может, это и работает лучше, но как насчет практики? 
 
Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?
 
А что, если запись будет всего одна?
 
while( ($rnd2 = rand(1, 1)) ==$rnd);
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 02:15
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 20.11.2009 
					
					
					
						Сообщений: 257
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 спасибо, while (($rnd2=rand(1, $db1n))==$rnd){} работает) 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 06:42
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от subzey
			
		
	 | 
 
	| 
		Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?
	 | 
 
	
 
 это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
 
	
 
	| 
		
			Сообщение от subzey
			
		
	 | 
 
	| 
		На стенде, может, это и работает лучше, но как насчет практики?
	 | 
 
	
 
 и на практике это решение остается более производительным, чем ваш очень удобный один запрос. 
если хотите я могу протестировать насколько именно и опубликовать результаты  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 09:06
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 ⊞ Развернуть 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 11.01.2010 
					
					
					
						Сообщений: 1,810
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		А зачем три запроса к одной траблице, когда в результате первого запроса уже все есть? 
$res = mysql_query("SELECT * FROM writers"); // как ни крути, тяжеллый запрос
$res_length = mysql_num_rows($res);
$entries = array();
$i = 1;
$rnd1 = rand(1, $res_length);
while( ($rnd2 = rand(1, $res_length)) == $rnd1);
while($row = mysql_fetch_assoc($res)){
   if($i == $rnd1) $entries[0] = $row;
   if($i == $rnd2) $entries[1] = $row;
   $i++;
   if(count($entries) == 2) break;
}
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось B@rmaley.e><e, 20.03.2010 в 09:13.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.03.2010, 11:14
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Пионэр 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.11.2009 
					
					
					
						Сообщений: 1,322
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Gvozd
			
		
	 | 
 
	| 
		надо описать в логике PHP-скрипта, в пользу производительности.
	 | 
 
	
 
 Вот… это меня и смущает; по-моему, это задача для уровня БД, а не приложения. (Но, возможно, меня просто развратил PostgreSQL).
 B@rmaley.e><e, 
купить торт и съесть только вишенку. Тоже вариант, только, наверное, вместо while по mysql_fetch_assoc() — mysql_data_seek().  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.03.2010, 00:40
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Матрос 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.04.2008 
					
					
					
						Сообщений: 6,246
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от subzey
			
		
	 | 
 
	| 
		это задача для уровня БД
	 | 
 
	
 
 по логике-да 
к сожалению, все известные мне решения на чистом MySQL весьма и весьма непродуктивны. 
например ваше решение, как раз и есть то, за что вы осуждаете других
 
	
 
	| 
		
			Сообщение от subzey
			
		
	 | 
 
	| 
		купить торт и съесть только вишенку
	 | 
 
	
 
 вычислить для каждой строки таблицы случайную величину, отсортировать эту кучу случайных чисел а затем взять только строку, или две.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |