【问题标题】:Explanation of Simple SQL Query简单 SQL 查询说明
【发布时间】:2015-12-20 03:27:18
【问题描述】:

我有一个关于如何在这个 SQL 查询中使用小于运算符的问题,该查询回答了以下英文语句:

Drinkers who frequent at least two bars

注意:有一个名为frequents 的表,其中包含饮酒者和酒吧列。

现在,我最初通过使用 group byhaving count 运算符解决了这个问题,但我偶然发现了这个也是正确的查询:

SELECT DISTINCT f1.drinker
FROM frequents f1, frequents f2
WHERE f1.drinker = f2.drinker
AND f1.bar < f2.bar

我在理解这个查询的机制时遇到了一点麻烦,特别是最后的 AND 语句。

【问题讨论】:

  • 我相信 应该给出一些正确的结果,因为它仍然查询不相等。
  • @Engin 使用&lt; 而不是&lt;&gt; 的目的是防止在两个订单中都获得对。 (a, b) 和 (b, a)。由于存在 DISTINCT,因此对于最终结果来说有点没有实际意义,但可能会提高性能。
  • 这没有实际意义。没有它每个饮酒者都会被退回。
  • @Uueerdo 哈哈!从来没想过,也许是因为与众不同。谢谢。
  • @aquinas &lt;&lt;&gt; 的选择没有实际意义,而不是使用一般不等于运算符。

标签: mysql sql querying


【解决方案1】:

如果最后说 AND f1.bar &lt;&gt; f2.bar 会更有意义

因此,这里的想法是发生笛卡尔连接:表 1 的每一行都与表 2 的每一行连接。所以您可以想象您的结果集由 frequents 乘以自身的行数组成.例如,如果您有 10 行频繁访问,那么您的结果集中将有 100 行:每行与其他行连接。好的。所以从那个结果集中,你现在说,好吧,我只关心频繁 id 相同但它们经常出现的 bar 不同的行。显然, f1.bar f2.bar 是必要的,否则每一行都会与自身匹配。这保证了常客至少有两行显示。 distinct 负责删除额外的重复项。注意:count(*) 和 group by 是一种更好的方法。

【讨论】:

    【解决方案2】:

    桌子在同一个饮酒者上与自身相连。现在为了 f1.bar

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多