【问题标题】:Combining CASE and LIMIT in mysql在mysql中结合CASE和LIMIT
【发布时间】:2014-05-25 12:10:32
【问题描述】:

假设我有一张与这张表结构相似的表:

字段 1 |字段 2 |字段 3

1 - - - - 4 - - - - 这个

2 - - - - - 3 - - - - this_will_be_selected

3 - - - - - 2 - - - - this_will_be_selected

4 - - - - - 2 - - - - this_will_be_selected

1 - - - - - 4 - - - - this_one_could_also_be而不是第一个

6 - - - - 4 - - - - this_will_be_selected 因为没有其他 field2=4 AND field1=6

我想做的是在 field2 = 4 时在查询中获取 ALL field3 != 4limit 1

所以,对于这个查询,我会得到:

字段1 = 1 field3 = thisone

字段1 = 2 field3 = this_will_be_selected

字段1 = 3 field3 = this_will_be_selected

字段1 = 4 field3 = this_will_be_selected

字段1 = 6 field3 = this_will_be_selected

field1 = 1 及其字段 3“this_one_could_also_be”不会被选中

我希望我说清楚了!

我的想法是这样的:

SELECT field1, field3 FROM table WHERE LIMIT (CASE field2 WHEN 0 THEN 1 ELSE ...;

问题显然是它会限制检索到的行数总共,但我想要的是 DISTINCT 与 field2 但我不明白我应该怎么做...

【问题讨论】:

    标签: mysql


    【解决方案1】:

    看起来这就是你所追求的:

    SELECT field3 FROM MyTable
    WHERE field2 != 4
    UNION ALL
    SELECT MAX(field3) FROM MyTable
    WHERE field2 = 4
    GROUP BY field1;
    

    MAX() 函数可以任意选择要显示哪个 field3。 GROUP BY 确保每个不同的 field1 仅返回一行,其中 field2 为 4。

    【讨论】:

    • 我明白了……如果我也想选择 field1? SELECT field3,field1 FROM MyTable WHERE field2 != 4 UNION ALL SELECT MAX(field3),field1 FROM MyTable WHERE field2 = 4 GROUP BY field1; ?
    • 是的,您可以简单地将 field1 添加到选择查询中,因为它已经被分组了。如果您还想选择 field2,则必须将 field2 添加到分组子句中:GROUP BY field1, field2
    • 和性能问题有关,查询不会运行所有的记录,只有在选择它的MAX() 之后?运行时不是可以在创建后立即停止吗?
    • 不,我不相信这样的聚合函数存在,主要是因为很难想象一个现实的场景会有用。如果你想根据某种逻辑选择一个first 值,你可能需要生成一个行号,但这可能只会让查询变慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多