2012-07-02 3 views
2

Любой, кто мог бы мне помочь, будет очень благодарен.Выберите случайный результат, который не был отображен

Цель: Я хочу отобразить идентификатор из одной таблицы в случайном порядке, а также убедиться, что он не был замечен текущим пользователем.

Две таблицы: offers, has_seen

Я хочу, чтобы выбрать случайный идентификатор из предложения, проверить его на стол has_seen.

Если идентификатор существует в has_seen, ему необходимо выбрать другой случайный идентификатор. Тот же идентификатор никогда не должен видеть ни один пользователь текущего сеанса.

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

Я попытался это

$query = $this->db->query("SELECT * FROM ".$this->offer_table." WHERE NOT EXISTS (SELECT * FROM ".$this->shown_table." WHERE ".$this->shown_table.".camp_id = ".$this->offer_table.".camp_id AND ".$this->shown_table.".usercode = ".$this->session->userdata("table")." LIMIT 1 "); 
+1

Вы еще что-нибудь пробовали? –

+0

Я пробовал это: '$ query = $ this-> db-> query (" SELECT * FROM ". $ This-> offer_table." WHERE NOT EXISTS (SELECT * FROM ". $ This-> показано_table." WHERE " $ this-> shown_table. ". camp_id =". $ this-> offer_table. ". camp_id AND". $ this-> показано_table. ". usercode =". $ this-> session-> userdata ("table"). «LIMIT 1»), и да, я использую codeigniter, но прямой mysql будет в порядке. – user1497363

ответ

0

Вот как вы могли бы сделать это с помощью КИ дб класс:

// the maximum ID that is acceptable 
$max = $this->db->get('first_table')->count(); 

while(true) { 
    // get a random number 
    $randomID = rand(0,$max); 

    // the condition for which we will check the has_seen table 
    $condition = array(
     'id' => $randomID 
    ); 

    // if count is 0, it has not been seen. We add it to the table and return 
    // if it has been seen, the loop will repeat 
    if ($this->db->get_where('has_seen', $condition)->count() === 0) { 
     $this->db->insert('has_seen', array(
      'id' => $randomID 
     )); 
     return $randomID; 
    } 
} 
+0

интересно после ввода кода в i get: 'Fatal error: вызов неопределенного метода CI_DB_mysql_result :: count()' и i autoload класс db в autoconfig – user1497363

1

Я думаю, что это может быть достигнуто в обычном SQL, делая левое соединение, а затем проверяя значение null.

Что-то вдоль линий

SELECT * FROM table1 LEFT JOIN table2 USING (shared_key) WHERE table2.id IS NULL ORDER BY rand() LIMIT 1 
+0

Я получаю Неизвестный столбец 'ya2x8' в 'where clause', хотя я его дважды проверял. – user1497363

+0

Можете ли вы добавить свою структуру таблицы к своему вопросу, пожалуйста. –

0
SELECT * FROM `offers` WHERE `camp_id` NOT IN (SELECT `camp_id` FROM `has_seen` WHERE `user code` = 1) ORDER BY RAND() LIMIT 1 
+0

после редактирования для соответствия моим таблицам Я получаю Неизвестный столбец 'ya2x8' в 'where clause', хотя я дважды проверял его там – user1497363

0

Я всегда предпочитаю читать содержимое таблицы в массив и работать с ними оттуда. В зависимости от того, как вы планируете использовать результаты, вы можете сократить доступ к db, прочитав все это только один раз, а затем откройте массив (а затем, я полагаю, обновляю таблицу has_seen для следующего сеанса).

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

После того, как вы получили ваш массив, алгоритм выглядит следующим образом:

var array 
var end = array.length 

function getNextRandomUnseen 
{ 
    var i = rand(end) 
    var temp = array[i] 
    array[i] = array[end--] 
    return temp 
} 

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

array[end+1] = temp 
0

Спасибо за ответы. Я переписываю то, как это будет доведено до пользователя, и верю, что новый способ намного эффективнее, когда речь идет о сотнях людей на моем сайте сразу.

Спасибо!

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