2010-04-20 2 views
1

Мне интересно, если в MySQL есть какой-то умный способ вернуть «смешанный/сбалансированный» набор данных в соответствии с конкретным критерием?MySQL: Можно ли вернуть «смешанный» набор данных?

Для иллюстрации предположим, что в таблице могут быть потенциальные результаты, которые могут быть типа 1 или типа 2 (то есть столбец имеет значение 1 или 2 для каждой записи). Есть умный запрос, который будет иметь возможность непосредственно возвращать результаты чередующимися между 1 и 2 в последовательности:

первая запись типа 1, второй записи типа 2, третьей запись имеет типа 1, четвёртые запись относится к типу 2, и т. д.

Извинения, если вопрос глуп, просто найдите некоторые параметры. Конечно, я мог бы возвращать любые данные и делать это на PHP, но он добавляет некоторый код.

Спасибо.

+0

Итак, у вас есть таблица с столбцом 'x', которая содержит либо' 1', либо '2', и вы хотите, чтобы ваш результат возвращал строки с переменными значениями' x', я получаю это правильно? Какие-либо другие критерии сортировки? Что произойдет, если число '1'-строк не совпадает с количеством строк' 2'? –

+0

@ Питер-Ланг: Да, это так. Никаких других критериев сортировки, кроме предложения WHERE, безусловно. Если количество строк не одно и то же, то в идеале это будет заполнять все остальное любым типом, но я знаю, что это слишком много. – Tom

ответ

1

Что-то вроде этого запроса должно сделать:

Select some_value, x, c 
From 
(
    Select 
    some_value, x, 
    Case When x=1 Then @c1 Else @c2 End As c, 
    @c1 := Case When x=1 Then @c1+2 Else @c1 End As c1, 
    @c2 := Case When x=2 Then @c2+2 Else @c2 End As c2 
    From test_data, (Select @c1:=0, @c2:=1) v 
    Order By some_value 
) sub 
Order By c 

Он присваивает уникальные четные номера x=0 и нечетные числа до x=1 и использует эти значения в качестве критериев сортировки.


возвращает

some_value x c 
A   1 0 
X   2 1 
B   1 2 
Y   2 3 
C   1 4 
Z   2 5 

для следующего тест-данных:

Create Table test_data (
    some_value VARCHAR(10), 
    x INT 
); 

Insert Into test_data Values('A', 1); 
Insert Into test_data Values('B', 1); 
Insert Into test_data Values('C', 1); 
Insert Into test_data Values('Z', 2); 
Insert Into test_data Values('Y', 2); 
Insert Into test_data Values('X', 2); 

В значениях переменного правило сортируют по some_value, вы можете изменить это во внутреннем выберите или добавьте свои условия.

Если есть значения другого типа (1 или 2), вы можете получить их после отдыха (1 2 1 2 2 2).

+0

@Peter Lang: Вдохновленный материал, спасибо. Будет играть с этим. – Tom

0

Вы можете использовать функцию IF как часть оператора SELECT для изменения столбцов, но я не уверен, как сделать это автоматически, между двумя столбцами. Однако, если вы найдете надлежащее состояние, это будет работать для вас

SELECT IF(condition, first_column, second_column) FROM your_table 

first_column и second_column могут быть различного типа, например:

SELECT IF(id > 10, name, status_id) FROM clients 

хорошо работает, когда name является VARCHAR и status_id является INT

+0

@RaYell: Спасибо, почти там, но не совсем. Не желая возвращать разные столбцы, и на самом деле это не затрагивает чередующиеся, что является основной сутью вопроса. – Tom

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