簡體   English   中英

如何選擇MySQL中的相鄰列

[英]How to select adjacent columns in MySQL

我的表: vocabulary

    id          word
--------------------------
    1           hello
    2           hello
    3           how
    4           how
    5           how
    6           are
    7           hello
    8           hello
    9           are
    10          are
    11          are
    12          are
    13          hello

我想select id from vocabulary where id=$id and {all rows that are both the same word and adjacent}

注意:我想要它們兩個:[id = $ id]和[所有行都是相同的單詞和相鄰的行]

實際上,我需要一個SELECT查詢來做這樣的事情:( 三個例子)

  1. $id=1 ,結果: 1,2 // [1表示$id=1 ] - [2表示1和2的單詞相同且相鄰]
  2. $id=6 ,結果: 6 // [6 for $id=6 ]
  3. $id=10 ,結果: 9,10,11,12 // [10 for $id=10 ] - [9,11,12為10的單詞與9,11,12相同]

這是一個基本模式,你可以適應你的目的......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,word VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1 ,'hello'),
(2 ,'hello'),
(3 ,'how'),
(4 ,'how'),
(5 ,'how'),
(6 ,'are'),
(7 ,'hello'),
(8 ,'hello'),
(9 ,'are'),
(10,'are'),
(11,'are'),
(12,'are'),
(13,'hello');

SELECT a.id start
     , MIN(c.id) end 
  FROM my_table a
  LEFT 
  JOIN my_table b 
    ON b.id = a.id - 1
   AND b.word = a.word
  LEFT 
  JOIN my_table c 
    ON c.id >= a.id
   AND c.word = a.word
  LEFT 
  JOIN my_table d 
    ON d.id = c.id + 1
   AND d.word = a.word
 WHERE b.id IS NULL 
   AND c.id IS NOT NULL
   AND d.id IS NULL
 GROUP 
    BY a.id; 

+-------+------+
| start | end  |
+-------+------+
|     1 |    2 |
|     3 |    5 |
|     6 |    6 |
|     7 |    8 |
|     9 |   12 |
|    13 |   13 |
+-------+------+

正如McAdam331所暗示的,擴展這一想法的一種方法如下:

SELECT *  
  FROM vocabulary 
  JOIN tmpTable 
 WHERE id BETWEEN tmpTable.start AND tmpTable.end 
  AND tmpTable.start = $id;

這是一個使用變量的解決方案:

SELECT id, word
FROM (
  SELECT id,       
         @rnk:= CASE WHEN @word = word THEN @rnk 
                   ELSE @rnk + 1
              END AS rnk,
         @word:= word AS word
  FROM vocabulary, (SELECT @rnk:=0) as vars    
  ORDER BY id ) s
WHERE s.rnk = (
    SELECT rnk
    FROM (
      SELECT id,       
             @r:= CASE WHEN @w = word THEN @r 
                       ELSE @r + 1
                  END AS rnk,
             @w:= word AS word
      FROM vocabulary, (SELECT @r:=0) as vars    
      ORDER BY id ) t
    WHERE id = 10) -- 10 is equal to $id

SQL小提琴演示

由於MySQL中缺少CTE ,相同的查詢重復兩次。 @rnk@r變量用於識別連續的島嶼word內的值vocabulary表。

第二個查詢選擇島值(例如,對於id = 10 @r = 5 ),第一個查詢使用該值來選擇屬於同一島的所有記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM