0

MySQLクエリがあります:

SELECT * 
FROM t1
WHERE ABS(TIMESTAMPDIFF(MINUTE, ts, (SELECT ts FROM t1 WHERE id=1 AND c1 < 5))) < 3
AND id=1

サブクエリは4行を返すため、クエリを実行できません。joinを使用するように変更しました:

SELECT * 
FROM t1 a INNER JOIN t1 b 
ON a.id=b.id AND b.id=1 AND c1<5
WHERE ABS(TIMESTAMP(MINUTE, a.ts, b.ts))<3;

2つの質問があります:1。(サブクエリから結合に)正しく変換しましたか?2.とにかく私のサブクエリを修正しますか?

ありがとう。

4

2 に答える 2

1

1.すべてのフィールドにプレフィックスを付ける必要があるため(タイプミスの可能性があります)、無効です。そうしないと、あいまいなエラーが発生します。およびその他のタイプミス(TIMESTAMPの代わりにTIMESTAMPDIFF

ちなみに、あなたの場合、述語条件を結合ではなく、where句に入れることができます。

SELECT a.* 
FROM t1 a 
INNER JOIN t1 b 
ON a.id=b.id 
WHERE a.id = 1
AND b.c1 < 5
AND ABS(TIMESTAMPDIFF(MINUTE, a.ts, b.ts))<3;

2.たぶんEXISTS句がその仕事をすることができます。

SELECT a.*
FROM t1 a
WHERE a.id = 1
AND EXISTS 
  (SELECT NULL FROM t1 b
   WHERE b.id = a.id
   AND b.c1 < 5
   AND TIMESTAMPDIFF(MINUTE, a.ts, b.ts) < 3)
于 2012-10-29T07:59:19.133 に答える
1

このようなselectクエリで個別のキーを使用できます

SELECT  distinct a.* FROM t1 a WHERE a.id = 1 AND EXISTS (SELECT NULL FROM t1 b WHERE b.id = a.id AND b.c1 < 5

AND TIMESTAMPDIFF(MINUTE、a.ts、b.ts)<3)

于 2012-10-29T08:27:32.030 に答える