Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中选择相邻列_Mysql_Select - Fatal编程技术网

如何在MySQL中选择相邻列

如何在MySQL中选择相邻列,mysql,select,Mysql,Select,我的表格:词汇表 id word -------------------------- 1 hello 2 hello 3 how 4 how 5 how 6 are 7 hello 8 hello 9 are 1

我的表格:
词汇表

    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
我想
从词汇表中选择id,其中id=$id和{同一单词和相邻的所有行}

注意:我想要两个:[id=$id]和[所有都是同一单词且相邻的行]

事实上,我需要一个
选择
查询来执行如下操作:(三个示例)

  • $id=1
    ,结果:1,2/[1表示
    $id=1
    ]-[2表示1和2的单词相同且相邻]
  • $id=6
    ,结果:6/[6对于
    $id=6
    ]
  • $id=10
    ,结果:9,10,11,12/[10代表
    $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
    

    由于MySQL中缺少
    CTE
    s,同一查询重复了两次
    @rnk
    @r
    变量用于识别
    词汇表中连续
    单词
    值的孤岛


    第二个查询选择孤岛值(例如,
    id=10
    @r=5
    ),第一个查询使用此值选择属于同一个孤岛的所有记录。

    这是一个“序列开始和结束”问题这是什么意思?这是不可能的吗?不。这意味着你现在知道该用谷歌搜索什么了。啊哈:)我用谷歌搜索了很多次,但我无法解决它:(嗯..老实说,我不明白..):(我在上编写了代码并检查了结果,但我不知道自己应该如何使用它。)@stack现在您已经知道了开始和结束序列,您可以执行如下操作:
    SELECT*从词汇表中加入tmpTable,其中id介于tmpTable.start和tmpTable.end以及tmpTable.start=$id;
    。这只是粗略的伪代码。啊哈,我想我得到了有一点:)!!!@McAdam331可以把你的建议作为一个新的答案吗?(彻底:)我的建议不是一个新的答案,只是草莓的一个延续。如果他想把它添加到他的答案中,这取决于他,因为任何人都可以过来阅读评论。@McAdam331至少编辑草莓的答案并添加你的建议。因为我不知道如何将你的建议和这个答案结合起来使用…!你能给我一些建议吗e简短的描述?@stack我想我确实给出了简短的描述。您可以尝试单独执行其中一个子查询以查看它返回的内容。然后您将意识到
    @r
    @rnk
    变量对于属于同一组值(也称为孤岛)的所有记录具有相同的值。