2009-09-28 6 views
0

У меня есть таблица, которая состоит из 3-х полей:PHP - SQL: Извлечение результатов в круговой моде

  • идентификатор
  • имя
  • статус

Каждый раз, когда я получаю результаты должны дать мне 5 имен, чей статус = 1. Предположим, что db содержит следующее:

id name status 
1 A 1 
2 B 1 
3 C 0 
4 D 1 
5 E 0 
6 F 0 
7 H 1 
8 I 1 
9 J 1 
10 K 1 
11 L 1 
12 M 0 

1-й раз, выборка должна возвращать: А, В, D, H, I (5 записей)
второй раз, выборка должна возвращать: J, К, L, A, B (5 записей)

ОБНОВЛЕНИЕ: Я не хочу типичного pagenation. У меня есть 12 доступных имен от A1 до A12. Первая выборка должна вернуть A1-A5, вторую выборку A6-A10 и третью выборку A11, A12, A1, A2, A3. Поэтому, когда я дойду до конца, мне нужно получить записи, начиная с первого, чтобы заполнить 5 слотов.

я делаю это в PHP с MySQL

+0

Вам это нужно на уровне сеанса или «глобально»? Как «точный» он должен быть (т. Е. Вам приходится беспокоиться о параллельности и сколько)? Является ли скорость проблемой (и насколько)? – VolkerK

+0

глобально, concurreny не проблема, желательно наилучшее усилие, – user177785

ответ

0

Следите за идентификаторы записей возвращаемого и следующие запросы делают:

select top 5 * 
from (
    select top 5 * 
    from MyTable 
    where status = 1 
     and id not in (1,2,4,7,8) 
    order by name 
    union 
    select top 5 * 
    from MyTable 
    where status = 1 
    order by name 
) a 
0
$q = mysql_query("SELECT name FROM table WHERE status = 1 LIMIT 5); 
while ($row = mysql_fetch_row($q)) 
{ 
    .... //first 5 
} 
$q = mysql_query("SELECT name FROM table WHERE status = 1 LIMIT 5,5); 
while ($row = mysql_fetch_row($q)) 
{ 
    .... //second 5 
} 

это использует смещение функциональности MySQL - подумайте об этом как о таргетинге на ваши результаты.

+0

Я не хочу pagenationg как таковой. У меня есть 12 доступных имен от A1 до A12. Затем сначала извлеките возврат A1-A5, secont fetch A6-A10 и третий выбор A11, A12, A1, A2, A3. Поэтому, когда я дойду до конца, мне нужно сделать несколько записей, начиная с frm, чтобы я заполнил слот 5 – user177785

1

Это похоже на какой-то сценарий распределения заданий?

Вам нужно 2 вещи:

  • самый высокий ID вернулся в прошлый раз сценарий был запущен (lastID)
  • число больше, чем максимальный идентификатор в таблице (bigNum)

Затем напишите ваш запрос как

SELECT 
    id, name 
FROM 
    table 
WHERE 
    status=1 
ORDER BY 
    (bignum + id) MOD (bigNum + lastID + 1) 
LIMIT 5 

Shazaam!

+0

. MySQL не может использовать индекс для этого предложения ORDER BY, но ему нужна таблица temp и filesort. Запрос может стать медленным, если есть много записей. Если это не проблема: палец вверх. – VolkerK

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