MySQL: возможно ли вернуть «смешанный» набор данных? - PullRequest
1 голос
/ 20 апреля 2010

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

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

1-я запись имеет тип 1, 2-я запись имеет тип 2, Третья запись типа 1, 4-я запись имеет тип 2, и т.д ...

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 апреля 2010

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

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 голосов
/ 20 апреля 2010

Вы можете использовать функцию 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

...