[英]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
查詢來做這樣的事情:( 三個例子)
$id=1
,結果: 1,2 // [1表示$id=1
] - [2表示1和2的單詞相同且相鄰] $id=6
,結果: 6 // [6 for $id=6
] $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
由於MySQL中缺少CTE
,相同的查詢重復兩次。 @rnk
和@r
變量用於識別連續的島嶼word
內的值vocabulary
表。
第二個查詢選擇島值(例如,對於id = 10
@r = 5
),第一個查詢使用該值來選擇屬於同一島的所有記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.