表格
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
答案 0 :(得分:1)
这假设id按顺序
使用变量指定rowid以了解每个项目的第一个和最后一个条目。
JOIN
一起选择from
中的F
和to
中的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 )
因为如果你想要考虑中间城市的东西要复杂得多