MySQL SELECT BETWEEN两点

时间:2016-01-19 18:52:29

标签: mysql join

表格

pid   pname  
1     Amsterdam  
2     London  
3     Miami   
4     Bonn    
5     Oslo   
6     Madrid   
7     Lisbon  

表根

    id   from    to     projectid  
    2    1       3      1 //Project#1 starts from Amsterdam  
    3    3       2      1 //Project#1 ends at London  
    4    3       5      2 //Project#2 starts from Miami and ends at Oslo    
    5    3       5      3  
    6    5       6      3    
    7    4       2      4  
    8    2       4      5   
    9    6       4      6  
    10   4       5      6  

我需要一个包含所有起点和终点的结果集,即:

start   end    projectid  
1       2       1 //Amsterdam London  
3       5       2 //Miami Oslo  
3       6       3  
4       2       4  
2       4       5  
6       5       6  

所以,我需要一个清单,显示两个城市之间的所有项目,例如伦敦和波恩之间:

4       2       4  
2       4       5  

1 个答案:

答案 0 :(得分:1)

这假设id按顺序

使用变量指定rowid以了解每个项目的第一个和最后一个条目。

JOIN一起选择from中的Fto中的T

<强> SQL Fiddle Demo

SELECT F.`from`, T.`to`, F.`projectid`
FROM (
      SELECT `id`, `from`, `to`, `projectid`,
              @row := IF(@prev = `projectid`,
                         @row + 1,
                         IF( @prev := `projectid`, 1, 1)
                        ) as rn
      FROM roots R
      CROSS JOIN (SELECT @row = 0 , @prev = 0) x
      ORDER BY `projectid`, `id`
    ) F
JOIN   
    (
      SELECT `id`, `from`, `to`, `projectid`,
              @row := IF(@prev = `projectid`,
                         @row + 1,
                         IF( @prev := `projectid`, 1, 1)
                        ) as rn
      FROM roots R
      CROSS JOIN (SELECT @row = 0 , @prev = 0) x
      ORDER BY `projectid`, `id` DESC  -- HERE ID is DESC to get last entry
    ) T
  ON F.`projectid` = T.`projectid` 
 and F.`rn` = 1
 and T.`rn` = 1

<强>输出

| from | to | projectid |
|------|----|-----------|
|    1 |  2 |         1 |
|    3 |  5 |         2 |
|    3 |  6 |         3 |
|    4 |  2 |         4 |
|    2 |  4 |         5 |
|    6 |  5 |         6 |

注意

将演示查询更改为SELECT *,以便检查发生的情况。有时最后一个条目等于第一个条目。

对于你的第二个问题取决于你是否只计算城市在第一个或结束时。

   SELECT *
   FROM <previous query>
   WHERE (`from` = @CityA and `to`= @CityB )
      OR (`from` = @CityB and `to`= @CityA )

因为如果你想要考虑中间城市的东西要复杂得多