SQL - MYSQL 一个查询接收不同列值的设置限制

Posted

技术标签:

【中文标题】SQL - MYSQL 一个查询接收不同列值的设置限制【英文标题】:SQL - MYSQL One query recieving set limit on different column values 【发布时间】:2017-09-11 20:57:39 【问题描述】:

假设我有一个包含一组不同列的表(offcourse),

例子:

Table 
   id
   col1 INTEGER(1),   // 0 || 1
   col2 // --||--
   col3 // --||--
   col4 // --||--

是否有可能,在 1 个查询中选择 col1=1 的 4 行,然后选择 col2=1 的 4 行,然后选择 col3=1 的 4 行等。我想你明白我的意思。

到目前为止,我所做的是进行 4 个不同的查询或进行一个查询,然后执行一个(col1 = 1 OR col2=1 OR... 等)。

这可行,但如果我将结果限制为 16,那么我可能会得到 15 行 col1=1 和可能 1 行 col2=1 然后 col3,col4 - 没有结果。

亲爱的小伙伴们;有没有办法在 1 个查询中做到这一点(我认为没有)

【问题讨论】:

你可以尝试使用union子句。 Here 这种问题有时是设计不佳的症状 您好!是的,我同意这一点。问题不存在开始。客户需求和快速修复的集成解决了这样的结构。然而,我正在考虑将查询结果保存到会话中,这样它就不会在每个请求上都经历所有这些事情。感谢您的回复 【参考方案1】:
Select * from table where col1=1 limit 4
Union
Select * from table where col2=1 limit 4
Union
Select * from table where col3=1 limit 4
Union 
Select * from table where col4=1 limit 4

这将为您提供一个最多 16 条记录的结果。如果某个特定条件的行数少于 4 行,您将获得更少的行数。重复项将被删除,导致少于 16 行。不是不同的行。

如果对于单行 col1=1 and col2=1,那么如果您使用 union all,它可能会返回两次,但对于大型数据集,只有 union 会更慢

【讨论】:

是的 :) 很好的解决方案。我了解成本。非常感谢你。我会试试这个并测试速度。也许 4 个不同的独立查询更快。这取决于。【参考方案2】:

我认为您正在寻找 UNION ALL 构造。你可以简单地写

SELECT * FROM tab WHERE col1 = 1
UNION ALL
SELECT * FROM tab WHERE col2 = 2
UNION ALL
SELECT * FROM tab WHERE col3 = 3

等等。请注意,结果中的行可能会重复(如果它们满足条件中的更多条件)。

【讨论】:

@HugoDelsing 的答案更好,因为它包含 LIMIT 是的,这有点问题,但如果我们扩展查询,它可能会起作用。谢谢。 我会将此标记为解决问题,但正如@JacquesAmar 所说,Hugos 的答案更接近一点,不是因为限制条款,而是因为联盟解释

以上是关于SQL - MYSQL 一个查询接收不同列值的设置限制的主要内容,如果未能解决你的问题,请参考以下文章

如何在MySql中返回具有相同列值的行

MySQL优化COUNT()查询

SQL 查询以查找具有相同列值的多行

用于连接 Oracle 中多行的列值的 SQL 查询

将行恢复为默认列值mysql

SQL如何查询出某一列中不同值出现的次数?