2013-06-19 1 views
2

У меня есть таблица (MySql), где один столбец является «Значение» между -3 и 3. Что я пытаюсь сделать это:SQL, если случайный результат имеет значение меньше X, возвращает более случайные результаты до достижения значения X?

  1. Вытащите случайную строку из таблицы, если это " Значение "является положительным числом (от 1 до 3, в моем случае - отрицательные значения будут использоваться для чего-то еще и здесь не актуальны)
  2. Если« Значение »равно 3, отобразите только эту строку.
  3. Если «Значение» равно 2, отобразите эту строку плюс другую случайную строку со значением «Значение» 1.
  4. Если «Значение» равно 1, отобразите эту строку плюс одну еще строку с символом « «Значение» из 2 или 2 строк с «значением» 1.

Или, если это так, мне нужны строки, перечисленные до тех пор, пока общее их значение не будет 3 - выполнено ни одной строкой со значением 3, двумя строками со значениями 1 и 2 (или 2 и 1) или тремя строками со значением 1 каждый.

Вот что у меня есть:

$query = "SELECT * FROM $usertable WHERE Value>0 ORDER BY RAND() LIMIT 1"; //from all positive Values, get one at random 
$query2 = "SELECT * FROM $usertable WHERE Value BETWEEN 1 AND 2 ORDER BY RAND() LIMIT 1"; //from all Values between 1 and 2, get one at random 
$query3 = "SELECT * FROM $usertable WHERE Value=1 ORDER BY RAND() LIMIT 1"; //from all Values equal to 1, get one at random 
$result = mysql_query($query); 
$result2 = mysql_query($query2); 
$result3 = mysql_query($query3); 

while($row = mysql_fetch_array($result)) 
    { 
    echo $row['A'] . " " . $row['B'] . " " . $row['C'] . " " . $row['Value']; 
    echo "<br>"; 
    } 
while($row['Value']<3) 
    { 
    while($row2 = mysql_fetch_array($result2)) 
     { 
    echo $row2['A'] . " " . $row2['B'] . " " . $row2['C'] . " " . $row2['Value']; 
    echo "<br>"; 
     } 
    } 
while($row['Value'] + $row2['Value']<3) 
    { 
    while($row3 = mysql_fetch_array($result3)) 
     { 
     echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value']; 
     echo "<br>"; 
     } 
    } 

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

Так я это прямо сейчас, то код будет работать и время с этой ошибкой: «Фатальная ошибка: Максимальное время выполнения 30 секунд превышен» И это не делать то, что мне это нужно, чтобы (это по-прежнему вытягивая результаты, если первое «значение» равно 3).

Может ли кто-нибудь указать, что я делаю неправильно? Должен быть лучший способ выполнить этот сценарий, чем то, что я делаю, но я просто не вижу его. Может ли кто-нибудь указать мне правильный путь? Благодаря!

+0

Функции PHP, начинающиеся с 'mysql_', устарели от PHP 5.5.0. Если вы в состоянии сделать это, попробуйте обновить свой код, чтобы использовать [MySQLi] (http://www.php.net/manual/en/book.mysqli.php) или [PDO] (http://www.php.net/manual/en/ref.pdo-mysql.php). –

+0

Я не эксперт по php, но как циклы 'while' должны заканчиваться? –

+0

@ joe-frambach Спасибо за предложение, я сделаю обновления, как только я получу его для правильной работы (если только использование mysqli_ не исправит меня для меня!) – britne

ответ

2

Вы можете сделать это в SQL. Трюк обрабатывает случай, когда у вас есть 2 + 2. Вы должны игнорировать второй.

Следующее обрабатывает это путем определения переменной @sum.Это увеличивается на value, если необходимо, с одним завихрением. Если значение не попадает 3, то строка игнорируется:

select t.*, 
     @sum := if(@prevsum := @sum < 3 and @sum + value > 3, @sum, @sum + value) as thesum 
from (select * 
     from t 
     where value > 0 
     order by RAND() 
    ) t cross join 
    (select @sum := 0, @prevsum := 0) const 
having (@sum - value) <= 3 and (@prevsum <> @sum) 

Это поддерживает @prevsum поэтому он знает, чтобы игнорировать последнюю строку в случае как «2 + 2» или «1 + 1 + 2».

0

Ваш цикл while($row['Value'] < 3) никогда не кончится, потому что вы никогда не меняете $row.

Я хотел бы предложить что-то вроде этого:

$first = mysql_fetch_assoc(mysql_query("select * from `".$usertable."` where `Value`>0 order by rand() limit 1")); 
$result = array($first); 
switch($first['Value']) { 
case 1: 
    $val = rand(1,2); 
    $rows = 3-$val; // 2 if $val is 1, 1 if $val is 2 
    $q = mysql_query("select * from `".$usertable."` where `Value`=".$val." order by rand() limit ".$rows); 
    while($r = mysql_fetch_assoc($q)) $result[] = $r; 
    break; 
case 2: 
    $result[] = mysql_fetch_assoc(mysql_query("select * from `".$usertable."` where `Value`=1 order by rand() limit 1")); 
    break; 
// case 3 does nothing special 
} 
// result rows are in $result[] array. 
+0

Я пробовал это, но у меня все еще возникают проблемы с отобразите его часть. Я добавил 'while ($ row = mysql_fetch_array ($ result)) \t { echo $ row ['A']. "". $ row ['B']. "". $ row ['C']. "". $ Строки [ 'Значение']; echo "
"; \t} 'в конец вашего кодового блока, но я получаю следующее:' Предупреждение: mysql_fetch_array() ожидает, что параметр 1 будет ресурсом, null указан в /home/content/09/10184409/html/trait2.php on line Где строка 27 - мой 'while ($ row = mysql_fetch_array ($ result))' – britne

+0

'$ result' - это массив, а не результат MySQL. После использования моего кода используйте 'foreach ($ result as $ row)' и вы можете его вывести. –

0

Ваши mysql_query находятся в неправильном месте.

Вы должны понимать, что запрос выполняется в точке, где называется mysql_query, следовательно, вы в ваше время в корыте циклов, в том же ряду, снова и снова ...

Вот почему вы получаете максимальное EXEC время ...

EDIT

$query = "SELECT * FROM $usertable WHERE Value>0 ORDER BY RAND() LIMIT 1"; //from all positive Values, get one at random 
$query2 = "SELECT * FROM $usertable WHERE Value BETWEEN 1 AND 2 ORDER BY RAND() LIMIT 1"; //from all Values between 1 and 2, get one at random 
$query3 = "SELECT * FROM $usertable WHERE Value=1 ORDER BY RAND() LIMIT 1"; //from all Values equal to 1, get one at random 


$result = mysql_query($query); 
$row = mysql_fetch_array($result); 
echo $row['A'] . " " . $row['B'] . " " . $row['C'] . " " . $row['Value']; 
echo "<br>"; 

if ($row['Value'] < 3) 
{ 
    switch($row['Value']) 
    { 
     case 2: //If the "Value" is 2, display that row, plus another random row with a "Value" of 1. - thats your query3 
      $result3 = mysql_query($query3); 
      $row3 = mysql_fetch_array($result3); 
      echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value']; 
      break; 

     case 1: //If the "Value" is 1, display that row, plus either one more row with a "Value" of 2, or 2 more rows each with a "Value" of 1. - your query2 
      $result2 = mysql_query($query2); 
      $row2 = mysql_fetch_array($result2); 
      echo $row2['A'] . " " . $row2['B'] . " " . $row2['C'] . " " . $row2['Value']; 
      if($row2['Value'] == 1) 
      { //select another row with value of 1 - your query3 
       $result3 = mysql_query($query3); 
       $row3 = mysql_fetch_array($result3); 
       echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value']; 
      } 
      break; 
    } 
} 

Пожалуйста, обратите внимание, что этот код может выбрать один ряд несколько раз - вы не mentiond, что строки должны быть уникальными. Если вам понадобятся уникальные строки, вам нужно изменить код sql, чтобы не выбирать все уже выбранные строки (т. Е. Каким-то уникальным идентификатором или полным возвратом результата)

+0

Есть ли у вас предложение, как это сделать правильно? Я знал, что мой код ошибался, и искал некоторые предложения. – britne

+0

См. Отредактированный пост с примером кода –

Смежные вопросы