0

クエリ 1:

SELECT * 
FROM user_d1 
WHERE EXISTS (SELECT 1 
              FROM `user_d1` 
              WHERE birthdate BETWEEN '1989-08-04' AND '1991-08-04') 
ORDER BY timestamp_lastonline DESC 
LIMIT 20

クエリ 2:

SELECT * 
FROM user_d1 
WHERE birthdate BETWEEN '1989-08-04' AND '1991-08-04' 
ORDER BY timestamp_lastonline DESC 
LIMIT 20

そして、私が本当に理解していないのは、クエリ 2が間違った結果を返すのはなぜですか? birthdate最初に、次にtimestamp_lastonline...で並べ替えられたリストを返します。

4

2 に答える 2

9

クエリ 1 : 日付の間に少なくとも 1 つのレコードが存在する場合、talbe 全体が取得されます。

クエリ 2 : 日付間のレコードのみが取得されます。

仕組みについては、こちらをお読みくださいEXISTS

于 2012-06-18T08:20:47.163 に答える
1

2 番目のクエリは BETWEEN を使用して、最初のエントリと'1989-08-04'次のエントリの間のすべてのエントリを返し、次の'1991-08-04'順序でこれらを並べ替えtimestamp_lastonline DESCます。これは文字どおり、1989 年から 1991 年までの年を持つすべてのエントリではなく、これら 2 つの値を持つ 2 つのエントリ間のエントリを返していることに注意してください (手動でこれらを時系列にインデックス化するように注文しない限り!)。timestamp_lastonlineBETWEEN 句が返す行がある場合、順序付けられたテーブル内のすべてのエントリが取得されるため、最初のクエリが何を返すと思うかを知りたいです。

于 2012-06-18T08:21:54.150 に答える