2010-10-07 2 views
0

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

Например стол: продукты идентификатор, имя, sort_order, expiration_date

таблицы: списки идентификатор, PRODUCT_ID

Скажем, я хочу, чтобы всегда иметь 15 продуктов в таблице перечислены и в порядке. Однако срок действия продуктов истекает, и когда это происходит, они удаляются из таблицы списков, тогда нам нужно добавлять новые продукты на основе «next in line» by sort_order (последний идентификатор sort_order в списках + 1, если он существует , если нет, начните сначала).

Я надеюсь, что это имеет смысл ...

Но мой вопрос, есть ли способ, чтобы справиться с этим все в одном запросе?

Прямо сейчас, вот как я бы это сделать:

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

ответ

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

прибудет 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; 
Смежные вопросы