我正在编写一个跟踪各种路线的物流应用程序,我想编写可以找到系统中所有路线的代码。
例如,在以下数据库中:
From | To | Time
------------------------
Seattle | Chicago | 12PM
Chicago | Seattle | 9 AM
Seattle | Chicago | 2PM
Chicago | Houston | 3PM
结果应为:
From | To
-----------------
Seattle | Chicago
Chicago | Houston
基本上,方向无关紧要,只有配对才有意义。
我尝试通过djangos raw()函数使用join语句,但这会打印出所有路由乘以该对出现的次数,因此在上面的示例中它将打印出第一,第二和第三条记录3次每个以及最后一个记录。
fls = Route.objects.raw('SELECT * '
'FROM manager_route f1, flights_flight f2 '
'WHERE (f1.origin_id = f2.destination_id AND f1.destination_id = f2.origin_id)'
'OR (f1.origin_id = f2.origin_id AND f1.destination_id = f2.destination_id)')
答案 0 :(得分:0)
搜索了一段时间后,我找到了解决方案:
fls = Route.objects.raw(
'SELECT f1.* '
'FROM manager_route f1 '
'JOIN manager_route f2 '
'ON f1.origin_id = f2.destination_id '
'AND f1.destination_id = f2.origin_id '
'AND f1.origin_id > f2.origin_id '
'GROUP BY f1.origin_id, f1.destination_id'
)
将选择不同的城市对(据我所知,不会以任何排序的方式授予),需要使用GROUP BY来防止多次打印每个条目(否则会打印该对出现的次数)< / p>