Есть ли способ записать выбранную запись, начиная с конкретной записи? Предположим, у меня есть таблица со следующими данными:
SNO ID ISSUE
----------------------
1 A1 unknown
2 A2 some_issue
3 A1 unknown2
4 B1 some_issue2
5 B3 ISSUE4
6 B1 ISSUE4
Могу ли я написать выбор для начала показа записей, начинающихся с B1, а затем оставшихся записей? Результат должен быть примерно таким:
4 B1 some_issue2
6 B1 ISSUE4
1 A1 unknown
2 A2 some_issue
3 A1 unknown2
5 B3 ISSUE4
Не важно, является ли последний B3 последним, только сначала должен отображаться B1.
Пара различных вариантов в зависимости от того, что вы "знаете" раньше времени (т.е. идентификатор записи, который вы хотите быть первым, sno и т.д.):
Союзный подход:
select 1 as sortOrder, SNO, ID, ISSUE
from tableName
where ID = 'B1'
union all
select 2 as sortOrder, SNO, ID, ISSUE
from tableName
where ID <> 'B1'
order by sortOrder;
Оператор дела по порядку:
select SNO, ID, ISSUE
from tableName
order by case when ID = 'B1' then 1 else 2 end;
Вы также можете рассмотреть использование временных таблиц, cte и т.д., но эти подходы, вероятно, будут менее эффективными... попробуйте несколько разных подходов в вашей среде, чтобы увидеть, какие из них лучше всего работают.
Предполагая, что вы используете MySQL, вы можете использовать IF() в предложении ORDER BY...
SELECT SNO, ID, ISSUE FROM table ORDER BY IF( ID = 'B1', 0, 1 );
... или вы можете определить функцию, которая накладывает порядок сортировки...
DELIMITER $$
CREATE FUNCTION my_sort_order( ID VARCHAR(2), EXPECTED VARCHAR(2) )
RETURNS INT
BEGIN
RETURN IF( ID = EXPECTED, 0, 1 );
END$$
DELIMITER ;
SELECT SNO, ID, ISSUE FROM table ORDER BY my_sort_sort( ID, 'B1' );
select * from table1
where id = 'B1'
union all
select * from table1
where id <> 'B1'