1

の > 6にない の 1 ~ 3 のすべてdataを取得したいidid

簡単にするために ID を使用していますが、実際にはタイムスタンプを使用しています。

CREATE TABLE test (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  data varchar(3) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

INSERT INTO test (id, data) VALUES
(1, 'abc'),
(2, 'def'),
(3, 'ghi'),
(4, 'jkl'),
(5, 'mno'),
(6, 'pqr'),
(7, 'def'),
(8, 'vxw'),
(9, 'yz');

私が試した数十のクエリのうちの1つ。

SELECT
  t1.data t1_data,
  t2.data t2_data
FROM test t1
JOIN test t2
  ON t2.id BETWEEN 1 AND 3
    AND t1.id > 6
    AND t1.data <> t2.data

だから私はこの結果を得たい:

+----------+
|   data   |
+----------+
|   abc    |
|   ghi    |
+----------+
4

4 に答える 4

1
SELECT t1.data AS t1_data
FROM test t1
WHERE t1.id BETWEEN 1 AND 3
AND NOT EXISTS(
  SELECT *
  FROM test t2 
  WHERE t2.data = t1.data
  AND  t2.id > 6
  );
于 2013-11-05T01:10:25.440 に答える
1

これは、set-within-sets サブクエリの例です。havingこれが最も一般的なアプローチであるため、句を使用した集計を使用してこれらにアプローチするのが好きです。あなたの場合:

select t1.data 
from test t1
group by t.data
having sum(id between 1 and 3) > 0 and
       sum(id > 6) = 0;

句の条件は、having各条件を満たす行の数をカウントします。data1 つ目は、1 から 3 の間の が (所定の に対して)少なくとも 1 行あることを示しています。2 つ目は、が 6 より大きいid行はないことを示しています。id

于 2013-11-05T01:22:59.710 に答える
0

それを行うにはいくつかの方法があります (おそらくパフォーマンス的には外部結合が最適かもしれません) が、概念的には次のとおりです。

SELECT t1.data
  FROM test t1
 WHERE t1.id < 4 
   AND t1.data NOT IN
   (SELECT t2.data
      FROM test t2
     WHERE t2.id > 6)

外部結合バージョンは次のようになります。

SELECT t1.data
  FROM test t1 LEFT OUTER JOIN test t2
    ON t1.data = t2.data and t1.id < 4 and t2.id > 6
 WHERE t2.id IS NULL
于 2013-11-05T01:16:03.293 に答える