Как сделать чтобы некоторые записи в MYSQL запросе всегда были на первых позициях

KSERG

Новичок
Как сделать чтобы некоторые записи в MYSQL запросе всегда были на первых позициях

Как сделать чтобы некоторые записи в MYSQL запросе всегда были на первых позициях независимо от LIMIT.
Тоесть есть таблица в ней некотырые записи отмечены 1 в отдельном поле (припустим три некоторые записи).
Нужно чтобы эти три записи всегда были бы первыми в результате запроса, независимо стоит ли LIMIT 0, 10 , или же LIMIT 100,10.

Зарание, спасибо.
 

Фанат

oncle terrible
Команда форума
это очевидно
запрашивать их отдельно.

-~{}~ 17.10.05 23:40:

svetasmirnova, нет
 

svetasmirnova

маленький монстрик
Фанат
Почему? У него же отдельное поле с записями 1 или 0, если я правильно поняла.
 

confguru

ExAdmin
Команда форума
Фанат

поможет поможет, только нужны знания SQL
 

Фанат

oncle terrible
Команда форума
попробуй запустить этот запрос в голове.

-~{}~ 17.10.05 23:46:

admin
хм. интересно.
типа, юнион какой-нибудь?
 

KSERG

Новичок
Припустим в таблице есть поле Selected где в троих записей стоит 1.
SELECT * from BASE ORDER BY Selected DESC
Возвращает этих три записи вверху, остальные дальше.

Но в запроссе SELECT * from BASE ORDER BY Selected DESC LIMIT 10,10 эти записи "уходят", как сделать чтобы они опять же были вверху результатов ?
 

KSERG

Новичок
подробней, пожалуйста...

-~{}~ 17.10.05 23:55:

С Union это решить легко, но вот нужно на старой Mysql. И временные таблицы не хочеться юзать...
 

Фанат

oncle terrible
Команда форума
господи, а временная -то таблица на кой тебе сдалась?
 

Фанат

oncle terrible
Команда форума
особенности чего?
твоей сексуальной ориентации?

если ты можешь внятно описать, почему задачу надо решать через задницу - будем думать.
если это страшная военная тайна левой пятки - обсуждай её сам с собой.
 

KSERG

Новичок
Запрос используется в существующе системе, в которой нету возможности править исходники PHP. Система берет запросы из базы, либо из файла. И исполняет их, и соответсвенно отображает результат. Вот по-этому и нужно записать соответсвующий запрос(или последовательность) запросов, которые в результате возвратили бы то что нужно
 

svetasmirnova

маленький монстрик
KSERG
С desc-ом only погорячилась, sorry. Как вариант: индекса типа auto increment нет?
 

svetasmirnova

маленький монстрик
[sql]
create table test (id integer auto_increment primary key not null, foo
varchar(255), t tinyint);

select * from test where t=1 or id in(offset_value, offset_value+limit_value) order by t desc limit limit_value;
[/sql]
Остаётся проблема с тем, что в поле id может быть такая последовательность: 1,2,5,6,7,23.... Сейчас подумаем как решить :)

-~{}~ 18.10.05 01:09:

Дружим просто:
[sql]
SELECT *
FROM test
WHERE t = 1 OR id>offset_value
ORDER BY t DESC
LIMIT limit_value;
[/sql]
Но это не привычный limit, конечно. Но пользоваться можно
 

KSERG

Новичок
Спасибо за помощь, такой вариант работает только если Id в таблице идут по-порядку с 1, и записи не удалялись. Если же записи были удалены и первый Id скажем остался 100 то в таком запросе не действует offset_value

-~{}~ 18.10.05 02:18:

Может можно как-то пронумеровать записи, которые реально присутсвуют в таблице ?

-~{}~ 18.10.05 03:14:

Решение найдено, покритикуйте плиз:

SET @n=0;
SELECT *
FROM test
WHERE t=1 or ( IF (t!=1, (@n:=@n+1),0) > offset_value ) ORDER BY t DESC LIMIT count_value
 

svetasmirnova

маленький монстрик
>такой вариант работает только если Id в таблице идут по-порядку с 1
Нет. Офсет в таком случае надо считать не по количеству строк, а по id: см. второй вариант.
>Решение найдено, покритикуйте плиз:
Хорошее решение.
А из PHP-скрипта как его можно выполнить?
 
Сверху