检查我的表中是否有特定的名称顺序

时间:2015-06-28 10:05:22

标签: mysql sql

我有以下表stops如何检查以下停止名称顺序GHI, JKL, MNO是否在我的停靠表中可用?

停止表:

CREATE TABLE IF NOT EXISTS stops
(
  stop_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  name varchar(30) NOT NULL, 
  lat double(10,6), 
  longi double(10,6)
);

简单:

1 ABC
2 DEF
3 GHI
4 JKL
5 MNO
6 PQR
7 SDU
8 VWX

3 个答案:

答案 0 :(得分:1)

如果订购的1

,此查询将返回'GHI','JKL','MNO'
SELECT 1
FROM stops s1 
JOIN stops s2 ON s1.stop_id = s2.stop_id - 1
JOIN stops s3 ON s2.stop_id = s3.stop_id - 1
WHERE CONCAT(s1.name, s2.name, s3.name) = CONCAT('GHI','JKL','MNO')

SQL Fiddle Demo

答案 1 :(得分:0)

这是众所周知的变种"找到相同的集合"任务。

您需要将搜索到的路线插入带有序列stop_id

的表格中
create table my_stops(stop_id INT NOT NULL,
                      name varchar(30) NOT NULL);

insert into my_stops (stop_id, name) 
values (1, 'GHI'),(2, 'JKL'),(3, 'MNO');

然后你加入并计算两个序列之间的差异。这将返回一个完全没有意义的数字,但对于连续值总是相同的:

select s.*, s.stop_id - ms.stop_id
from stops as s join my_stops as ms
on s.name = ms.name
order by s.stop_id;

现在按无意义的数字分组并搜索等于搜索步数的计数:

select min(s.stop_id), max(s.stop_id)
from stops as s join my_stops as ms
on s.name = ms.name
group by s.stop_id - ms.stop_id
having count(*) = (select count(*) from my_stops)

请参阅Fiddle

答案 2 :(得分:0)

另一种选择:

select 1 
from stops x 
where x.name = 'GHI' 
  and (select GROUP_CONCAT(name order by y.stop_id) 
       from stops y where y.stop_id between x.stop_id + 1 
                                        and x.stop_id + 2
      ) = 'JKL,MNO';