【问题标题】:MySQL: Is it possible to return a "mixed" dataset?MySQL:是否可以返回“混合”数据集?
【发布时间】:2011-02-10 02:11:29
【问题描述】:

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

为了说明,假设表中有可能是类型 1 或类型 2 的结果(即,列的每条记录都有值 1 或 2)。有没有一个聪明的查询可以直接返回1和2之间交替的结果:

第一条记录是类型 1, 第二条记录属于类型 2, 第三条记录是类型 1, 第 4 条记录属于类型 2, 等等……

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

谢谢。

【问题讨论】:

  • 因此,您有一个表,其中包含 x 列,其中包含 12,并且您希望对结果进行排序以返回具有交替值 x 的行,是吗?做对了吗?还有其他排序标准吗?如果1-rows 的数量与2-rows 的数量不同会怎样?
  • @Peter-Lang:是的,没错。没有其他排序标准,当然只有 WHERE 子句。如果行数不同,理想情况下它会用任何类型填充其余部分,但我知道这要求太多了。

标签: sql mysql select resultset


【解决方案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)。

【讨论】:

  • @Peter Lang:受启发的东西,谢谢。会玩这个。
【解决方案2】:

您可以使用 IF 函数作为 SELECT 语句的一部分来更改列,但我不确定如何在两列之间自动交替。但是,如果您发现合适的条件,这将适合您

SELECT IF(condition, first_column, second_column) FROM your_table

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

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

nameVARCHAR 并且status_idINT 时效果很好

【讨论】:

  • @RaYell:谢谢,差不多了,但不完全。不希望返回不同的列,它并没有真正解决交替问题,这是问题的主要要点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多