2010-10-07 90 views
0

我有一種情況,即基於另一列上的排序值構建新列表。基於排序值創建新項目

例如 表:產品 ID,名稱,排序順序,到期日期

表:列出 ID,PRODUCT_ID

比方說,我想永遠有15種產品的名單表和順序。但是,產品過期了,發生這種情況時,它們將從列表中刪除,然後我們需要根據sort_order(「列表+ 1」中的最後一個sort_order id,如果它存在如果不是,則重新開始)。

我希望這是有道理的......

但我的問題是,是否有一種方法來處理這一切都在一個查詢?

現在,這裏是我會怎麼做:

Query 1: SELECT count(*), sort_order as so FROM lists ORDER BY sort_order DESC 

if($count < 15){ 
    $difference = 15 - $count; 
    for($c = $count; $c >= 1; $c -=1){ 
     Query 2: SELECT id FROM products WHERE sort_order = $so + 1 LIMIT 1 
     if(results = 0){ 
      Query 3: SELECT id FROM products ORDER BY sort_order ASC LIMIT 1 

      Query 4: INSERT (id) into lists 

     }else{ 

      Query 5: INSERT (id) INTO LISTS 

     } 
    } 
} 

就好像很多查詢的一個相當簡單的任務....任何建議將是巨大的!

謝謝!

+0

建議1:你可以把插入語句如果條件之外,你不會需要其他人。 建議2:嘗試使用視圖而不是表格列表。 如果我正確理解要求,則需要15個未過期的產品進行排序。如果在該排序中沒有15個產品按照下一個排序順序查找產品 – Hemang 2010-10-07 22:36:03

回答

0

嗯,這樣的事情(我不完全清楚它的過程,但你明白了)。

$start_sort_order = N;//whatever integer it is. 


    INSERT INTO lists (id) 
    SELECT id FROM products 
    ORDER BY 
    sort_order < $start_sort_order, -- sort_order > $start_order == 0 => earlier, 
            -- sort_order < $start_order == 1 => at the end 
    sort_order      -- afterwards standard (so a result could be 
            -- like : 89,90,93,96,97,99,4,5,6,7, etc... 
    LIMIT 15; 
0

GET max_sort_order和current_sort_order

select id, if (p.sort_order > current_sort_order, 
    sort_order - $current_sort_order + $max_sort_order, 
    sort_order - $current_sort_order) 'relative_sort_order' from product 

order by relative_sort_order asc 
limit 15;