如何在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
变量对于属于同一组值(也称为孤岛)的所有记录具有相同的值。