2017-02-05 8 views
0

少なくとも3回連続して出現するすべての数字を見つけるSQLクエリを作成します。なぜa + 2 = b + 1 = c対a + 1 = bおよびb + 1 = cに対して異なる結果を返すのですか?

| Id | Num |

| 1 | 1 |

| 2 | 1 |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 2 |

| 7 | 2 |上記ログテーブル所与例えば

は、少なくとも3回連続して表示される唯一の数です。

私の元のクエリは、1と2を返します。

SELECT l1.Num 
    FROM Logs l1, Logs l2, Logs l3 
    WHERE l1.Id + 2 = l2.Id + 1 = l3.Id 
    AND l1.Num = l2.Num = l3.Num; 

+ ------------------------------ ------------------------------------------

次に、

SELECT l1.Num 
FROM Logs l1, Logs l2, Logs l3 
WHERE l1.Id + 1 = l2.Id AND l2.Id + 1 = l3.Id 
AND l1.Num = l2.Num AND l1.Num= l3.Num; 

+ -----:これに対するクエリは、正しい答えを返し、(基本的にI + 2 = B + 1 = C + 1 = BとB + 1 = C Aに変更します) -------------------------------------------------- -----------------

それは私を狂っている、私は私達の理由を理解することはできません。誰も私にこれを親切に説明できますか?前もって感謝します!!!!

+1

SQLでは、 '='は他の多くの遅延で '=='と同じです。 –

+0

「2 = 2 = 2」=> '(2 = 2)= 2' =>'(1)= 2' => '0'(FALSE) –

答えて

0

さて、このクエリを見てみましょう:ほとんどのプログラミング言語のようにMySQLでは WHERE l1.Id + 2 = l2.Id + 1 = l3.Id を、=は、彼らがしている場合、それは左と右サイドを取り、trueを返す意味だけで二項演算子であり、それ以外の場合は同じか偽です。

クエリでは、最初にl1.Id + 1l2.Idを比較して、真理値になります。そして真理値をl3.Idと比較します。 (真理値は自動的に0/1にキャストされます)。これは異なる結果につながります。

tl; dr:=は、=とよく似ているわけではありません。

+0

"ほとんどのプログラミング言語のようにMySQLで "私が '=='を知っている言語が使われています。 SQLはプログラミング言語ではありません。 –

0

複数の=演算子(連鎖)を使用すると、MySQLは左から右へ評価します。最も左の比較結果が次の操作に送られます。id=idリターン1と1 != 2ため

id=id=2はfalseを返します:このSQL Fiddleを見てみましょう。

今のところ、クエリに関しては、SELECTの変数を使用すると、より単純な方法があると思います。あなたのアプローチに基づいて、4回起こったすべての数字を見つけたらもう一度参加する必要があります。

SELECT id, num, 
@counter := IF(@previousNum = num, @Counter + 1, 1) AS counter, 
@previousNum := num as prevNum 
FROM test, (select @counter := 1, @previousNum := -1) a 
ORDER BY id; 

これは、連続したIDが同じnum値を持っている場合はインクリメントされるカウンタと一緒にidと値を返します。その代わり、我々はこのような何かを行うことができます。

我々は3回の以上の出演で値をフィルタリングしたい場合は今、私たちは例えば、別のSELECT文でこのクエリをラップする必要があります。:

SELECT id 
FROM 
(SELECT id, num, 
    @counter := IF(@previousNum = num, @Counter + 1, 1) AS counter, 
    @previousNum := num as prevNum 
    FROM test, (select @counter := 1, @previousNum := -1) a 
    ORDER BY id) a 
WHERE a.counter >= 3; 

ここでは、SQL Fiddleです。カウンター値を簡単に変更して、連続したさまざまなアピアランス数の値を調べることができます。

関連する問題