0

クエリ:

SELECT nummer
   FROM tabell_med_nummer
  WHERE SUBSTR(nummer, -1) = 0

このクエリは、「0」で終わるテーブル tabell_med_nummer 内の数値を選択します。たとえば、1000、1010、1020 は選択されますが、1001、1002 などは選択されません。

これに基づいて範囲を取得する必要があります。たとえば、1000 ~ 1100、または 1010 ~ 1023 です。範囲のサイズは可変です。何で終わるかは重要ではありませんが、1010 のように「0」で終わる数字を選択する必要があります。

注意が必要なのは、テーブルにすべての数値が存在するわけではないということです。したがって、テーブルに 1004 が存在しない場合は、100 の範囲が必要です。1000 から開始することはできません。

これを解決する方法を知っている人はいますか?

リクエストに応じて:

    +----+-------------+-------+-------+-------------------------------+---------------+---------+------+------+---------------------------------+
| id | select_type | table | type  | possible_keys                 | key           | key_len | ref  | rows | Extra                           |
+----+-------------+-------+-------+-------------------------------+---------------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | f     | ALL   | NULL                          | NULL          | NULL    | NULL |   19 | Using temporary; Using filesort |
|  1 | SIMPLE      | t2    | index | telefonnummer,telefonnummer_2 | telefonnummer | 5       | NULL | 1001 | Using index; Using join buffer  |
|  1 | SIMPLE      | p     | ALL   | NULL                          | NULL          | NULL    | NULL | 4568 | Using where; Using join buffer  |
|  1 | SIMPLE      | t3    | index | telefonnummer,telefonnummer_2 | telefonnummer | 5       | NULL | 1001 | Using index; Using join buffer  |
|  1 | SIMPLE      | t1    | ALL   | telefonnummer,telefonnummer_2 | NULL          | NULL    | NULL | 1001 | Using where; Using join buffer  |
+----+-------------+-------+-------+-------------------------------+---------------+---------+------+------+---------------------------------+
5 rows in set (0.00 sec)

テーブル名とフィールド名をいくつか変更し、いくつかの結合と where ステートメントを追加しました。

SELECT t1.telefonnummer start, t2.telefonnummer end, t1.kundenummer kundenummer, t1.fornavn fornavn, t1.etternavn etternavn, t1.bedriftsnavn bedriftsnavn, t1.organisasjonsnummer organisasjonsnummer, t1.partnerID partnerID

FROM TELEFONNUMMERTILDELING t1

JOIN TELEFONNUMMERTILDELING t2
ON t1.telefonnummer % 10 = 0
AND t1.telefonnummer <= t2.telefonnummer

JOIN TELEFONNUMMERTILDELING t3
ON t3.telefonnummer BETWEEN t1.telefonnummer AND t2.telefonnummer

JOIN TELEFONNUMMERTILDELING_POSTNUMMER p
ON p.postnummer = 4085

JOIN TELEFONNUMMERTILDELING_FYLKE f
ON f.ID = p.fylkeID GROUP BY start, end

HAVING end - start + 1 = COUNT(*)
AND end - start + 1 = 50
AND (kundenummer IS NULL OR kundenummer = '')
AND (fornavn IS NULL OR fornavn = '')
AND (etternavn IS NULL OR etternavn = '')
AND (bedriftsnavn IS NULL OR bedriftsnavn = '')
AND (organisasjonsnummer IS NULL OR organisasjonsnummer = '')
AND partnerID = 1001 
4

2 に答える 2

2
-- get the start and end points
SELECT   t1.nummer AS start, t2.nummer AS end

-- pair every possible start number with every potential end number
FROM     tabell_med_nummer t1
    JOIN tabell_med_nummer t2
      ON t1.nummer % 10 = 0 AND t1.nummer <= t2.nummer

-- obtain every number in between
    JOIN tabell_med_nummer t3
      ON t3.nummer BETWEEN t1.nummer AND t2.nummer

-- group into potential ranges
GROUP BY start, end

-- now limit only to contiguous ranges
  HAVING end - start + 1 = COUNT(*)

-- and those that contain the desired number of records
     AND end - start + 1 = ?

nummerが一意であることが保証されていない場合(制約など) は、パフォーマンスの低いものに置き換えるか、UNIQUEに置き換える必要があります。COUNT(*)COUNT(DISTINCT t3.nummer)t3(SELECT DISTINCT nummer FROM tabell_med_nummer)

于 2012-11-26T09:29:07.210 に答える
1

WHERE句に別の条件を追加します。

 SELECT nummer
   FROM tabell_med_nummer
  WHERE SUBSTR(nummer, -1) = 0 AND
        nummer BETWEEN 1000 AND 1100
于 2012-11-26T08:11:13.370 に答える