2010-04-20 31 views
1

我想知道是否有一些聪明的方式在MySQL中根据特定的标准返回“混合/平衡”数据集?MySQL:是否可以返回“混合”数据集?

为了说明这一点,假设一个表格中可能有类型1或类型2的结果(即列的每个记录的值为1或2)。是否有一个聪明的查询,从而能够按顺序直接返回1和2之间的结果交替:

月1日的记录是1型的, 第二个记录是2型, 第三战绩是1型的, 4记录类型2, 等...

道歉,如果问题很愚蠢,只是寻找一些选择。当然,我可以返回任何数据并在PHP中执行此操作,但它确实会添加一些代码。

谢谢。

+0

所以你有一个表'x'的列,其中包含'1'或'2',并且你想命令你的结果返回交替值为'x'的行,我知道这是正确的吗?任何其他排序标准?如果'1'行的数量与'2'行的数量不相同会发生什么? – 2010-04-20 11:17:22

+0

@ Peter-Lang:是的,没错。没有其他排序标准,但肯定是WHERE子句。如果行数不一样,理想情况下可以用任何类型填充其余行,但我知道这是要求太高。 – Tom 2010-04-20 11:29:23

回答

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排序,你可以在内部改变这种选择或添加您的条件。

如果有某种类型(12)的多个值,你休息(1 2 1 2 2 2)后得到它们。

+0

@Peter Lang:灵感来源,谢谢。会玩这个。 – Tom 2010-04-20 13:28:50

0

您可以使用IF函数作为您的SELECT语句的一部分来更改列,但我不确定如何使两列自动交替。不过,若你找到适当的条件下这会为你

SELECT IF(condition, first_column, second_column) FROM your_table 

first_columnsecond_column工作可以是不同类型的,例如:

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

效果很好,当name是一个VARCHARstatus_idINT

+0

@RaYell:谢谢,几乎在那里,但不完全。不希望返回不同的列,它并没有真正解决交替问题,这是问题的主要依据。 – Tom 2010-04-20 11:31:05

相关问题