2013-06-28 2 views
1

Мне нужно выбрать 4 случайных идентификатора из таблицы, но проблема в том, что они иногда дублируются, как этого избежать? Я попытался использовать DISTINCT, но без каких-либо результатов здесь приведен код. Что касается CMS, я использую opencart.Как избежать дублирования в случайном результате запроса в mysql

<h1>similar products</h1> 
<?php 
$id = $this->customer->getCustomerGroupId(); 
$cur_jur = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "currency` WHERE currency_id = '1'"); 
$cur_fiz = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "currency` WHERE currency_id = '3'"); 
$max_symb = 25; 
$fee_id = $product_id; 
$product_sql_test_fee = $this->db->query("SELECT `category_id` FROM `" . DB_PREFIX . "product_to_category` WHERE `product_id`='".$fee_id."' ORDER BY RAND() LIMIT 0,10"); 
$feed_id = $product_sql_test_fee->row['category_id']; 
$i=1; 
$imax = 5; 
$products_id = ''; 
while ($i < $imax) 
{ 
    $product_fee = $this->db->query("SELECT DISTINCT `product_id` FROM `" . DB_PREFIX . "product_to_category` WHERE `category_id`='".$feed_id."' AND NOT `product_id` = '".$products_id."' GROUP BY `product_id` ORDER BY RAND() LIMIT 0,10"); 
    if(isset($product_fee->row['product_id'])) 
    { 
     $pr_id[$i] = $product_fee->row['product_id']; 
    } 

    $pr_id_[$i] = $this->model_catalog_product->getProduct($pr_id[$i]); 
    $products_id .= $pr_id[$i].','; 
    $product_duplicate = explode(',',$products_id); 
    if ($product_duplicate[$i] == $pr_id[$i]) 
    { 

    } 


    //if ($product_duplicate[$i] == $pr_id[$i]){ //echo 'Duplicate'; 
    //continue;} else { 
    //foreach ($product_duplicate as $id) { 
    //if ($id == $pr_id[$i]) continue; 
    //} 
    //$price_plus = $pr_id_[$i]['price'] + ($pr_id_[$i]['price'] * 0.20); 
    //$price_minus = $pr_id_[$i]['price'] - ($pr_id_[$i]['price'] * 0.20); 
    //$price_of_product = (int)$price/$cur_fiz->row['value']; 
    //if ($price_of_product < $price_plus && $price_of_product > $price_minus) { 
    //echo $pr_id[$i].'||'.$price_minus.'||'.$price_plus.'||'.$pr_id_[$i]['price'].'||'.$price_of_product.'<br/>'; 
    //} 

    $price_plus = $pr_id_[$i]['price'] + ($pr_id_[$i]['price'] * 0.30); 
    $price_minus = $pr_id_[$i]['price'] - ($pr_id_[$i]['price'] * 0.30); 
    $price_of_product = (int)$price/$cur_fiz->row['value']; 
    if ($price_of_product < $price_plus && $price_of_product > $price_minus ) 
    { 
    } 
} 
?> 
+0

Поскольку вы используете тот же запрос в цикле while, он получит дубликаты. удалите цикл while, а затем добавьте цикл for, чтобы пройти через каждую строку запроса и вставьте логику цикла while – stackErr

+0

вы пробовали заказать rand() GROUP BY id и limit 4? Отформатируйте свой код, это грязно и неясно. – Robert

+0

Вы использовали как DISTINCT (который должен возвращать отдельные строки), так и GROUP BY (который используется с агрегатными функциями, но также могут быть использованы для удаления дубликатов), что кажется ненужным. – Kickstart

ответ

0

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

SELECT DISTINCT `product_id` FROM `" . DB_PREFIX . "product_to_category` WHERE `category_id`='".$feed_id."' AND NOT `product_id` = '".$products_id."' GROUP BY `category_id` 
+0

Довольно уверен, что не будет работать, так как product_id не содержится в группе, он получит ошибку. Его sql выглядит правильно, более вероятно, что он находится в цикле и случайным образом выбирает одно и то же дважды, как указано в комментариях. –

+0

@MikeC. один продукт может иметь разную категорию, и из-за этого он может получить дубликат записи. –

+0

Привет всем. Спасибо за ответы. Я попробовал группу по категориям и получил такую ​​ошибку. –