Tôi đã cố gắng thu hẹp vấn đề càng nhiều càng tốt, nó vẫn còn là một cái gì đó. Đây là câu hỏi mà không làm việc theo cách tôi muốn nó:GROUP BY với tổng hợp và INNER JOIN
SELECT *, MAX(tbl_stopover.dist)
FROM tbl_stopover
INNER JOIN
(SELECT edges1.id id1, edges2.id id2, COUNT(edges1.id) numConn
FROM tbl_edges edges1
INNER JOIN tbl_edges edges2
ON edges1.nodeB = edges2.nodeA
GROUP BY edges1.id HAVING numConn = 1) AS tbl_conn
ON tbl_stopover.id_edge = tbl_conn.id1
GROUP BY id_edge
Dưới đây là những gì tôi nhận được:
|id | edge | dist | id1 | id2 | numConn | MAX(tbl_stopover.dist) |
------------------------------------------------------------------
|2 | 23 | 2 | 23 | 35 | 1 | 9 |
|4 | 24 | 5 | 24 | 46 | 1 | 9 |
------------------------------------------------------------------
và đây là những gì tôi muốn:
|id | edge | dist | id1 | id2 | numConn | MAX(tbl_stopover.dist) |
------------------------------------------------------------------
|3 | 23 | 9 | 23 | 35 | 1 | 9 |
|5 | 24 | 9 | 24 | 46 | 1 | 9 |
------------------------------------------------------------------
Nhưng hãy để tôi giải thích một chút ...
Tôi có biểu đồ, giả sử như vậy:
node1
|
node2
/ \
node3 node4
| |
node5 node6
Vì vậy, tôi có một bảng tôi gọi tbl_edges như thế này:
| id | nodeA | node B |
------------------------
| 12 | 1 | 2 |
| 23 | 2 | 3 |
| 24 | 2 | 4 |
| 35 | 3 | 5 |
| 46 | 4 | 6 |
------------------------
Bây giờ mỗi edge
có "stop_over
s" ở một khoảng cách nhất định (để nodeA
). Do đó, tôi có bảng tbl_stopover như sau:
| id | edge | dist |
------------------------
| 1 | 12 | 5 |
| 2 | 23 | 2 |
| 3 | 23 | 9 |
| 4 | 24 | 5 |
| 5 | 24 | 9 |
| 6 | 35 | 5 |
| 7 | 46 | 5 |
------------------------
Tại sao truy vấn này?
Giả sử tôi muốn tính khoảng cách giữa các số stop_over
s. Trong phạm vi một cạnh không có vấn đề gì. Trên các cạnh sẽ khó khăn hơn. Nhưng nếu tôi có hai cạnh được kết nối và không có kết nối khác tôi cũng có thể tính toán khoảng cách. Dưới đây là một ví dụ giả định tất cả các cạnh có một length
của 10:
cạnh 23
có stop_over (id = 3
) tại quận = 9, cạnh 35
có stop_over (id = 6
) tại quận = 5. Do đó khoảng cách giữa hai số này là stop_over
s là:
dist = (length - dist_id3) + dist_id5 = (10-9) + 5
Tôi không chắc liệu mình có tự làm rõ hay không. Nếu điều này là không dễ hiểu, hãy đặt câu hỏi và tôi sẽ cố hết sức để làm cho điều này dễ hiểu hơn.
"stop_over" là gì? –
@ypercube: by stop_over Tôi có ý nghĩa giống như một trạm xăng trên đường cao tốc. Trong bối cảnh đó các cạnh sẽ là đường cao tốc, và các nút có thể là ... thành phố. – AudioDroid