【问题标题】:How can I get two at least two results from a MySQL query with two different where clauses?如何从具有两个不同 where 子句的 MySQL 查询中获得两个至少两个结果?
【发布时间】:2012-01-09 23:34:55
【问题描述】:

我正在使用 Query 构造函数,因此在某种程度上受到限制,因为我只能更改查询的构造,而不能将多个查询的结果汇总在一起。

因此,我正在寻找一种方法来从单个表中返回两个结果,其中包含 group_name 列

  • 其中 group_name = ''
  • 其中 group_name != ''

我想准确返回两个结果,一个满足每个条件。有没有办法通过 WHERE 子句、子查询、CASE 或控制流语句来做到这一点?

注意,由于这个旧的、受限的查询构建器,不能使用 UNION,但是我可以执行 Group By、Where 和其他一些事情。

最终,我相信它应该是相同的结果集,就好像你结合了这两个查询一样: SELECT * from business where group_name = '' LIMIT 1; SELECT * from business where group_name != '' LIMIT 1;

【问题讨论】:

  • 是否保证每个“where”都有结果?

标签: mysql


【解决方案1】:

试试

SELECT * FROM BUSINESS
GROUP BY (group_name='');

这将返回表中group_name 为'' 的第一条记录,以及!='' 的第一条记录。

如果您想为group_name 分别选择一条记录为“”、“asdf”或其他任何内容,您可以这样做:

SELECT * FROM BUSINESS
GROUP BY ( CASE group_name
           WHEN '' THEN 1
           WHEN 'asdf' THEN 2
           ELSE 3
           END );

这会将值 1 分配给 group_name'' 的任何值,将值 2 分配给任何 group_name'asdf' 的值,并将值 3 分配给其他所有值。

因为有一个GROUP BY,它会为每个记录选择一个(第一个出现的)。

(供您参考:CASE documentation。)

【讨论】:

  • 很确定“选择 * ... 分组依据”永远不会起作用。需要指定聚合函数:select count(x), sum(y), max(z)... group by
  • 在 MySQL 中可以。将它与非聚合列一起使用通常是荒谬的,如果这样做,您只会从每个组中获得一条记录。我只是建议它,因为 OP 似乎只想要每个组中的 1 条记录。
  • 是的,我使用的是 MySQL,只能保证 MySQL,所以它已经足够满足我的需求了,而且正如 math.coffee 计算的那样,我只需要每个结果中的 1 个。
  • 嘿,酷。语义是否与 LIMIT 1 相同?即:返回一个准随机选择的行?
  • 我不确定,但我不会指望它!
【解决方案2】:

你能做一个 UNION 吗?

(SELECT * FROM businesses WHERE group_name = '' LIMIT 1)
UNION
(SELECT * FROM businesses WHERE group_name != '' LIMIT 1)

如果您需要确定哪条记录来自哪个集合,您可以在每个集合中为静态字段设置别名:

(SELECT 'empty' AS group_name_status, * FROM businesses WHERE group_name = '' LIMIT 1)
UNION
(SELECT 'notempty' AS group_name_status, * FROM businesses WHERE group_name != '' LIMIT 1)

【讨论】:

  • 我实际上不能做一个 UNION,虽然 UNION 完全符合我的要求,谢谢你的回答,我应该澄清这不是一个选项。
【解决方案3】:

您尝试过 union 关键字吗? http://www.sql-tutorial.com/sql-union-sql-tutorial/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2021-07-25
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多