【发布时间】:2011-02-15 20:46:27
【问题描述】:
我正在从数据库中查询公交车站,我希望它只返回每个公交线路/方向的 1 个站点。这个查询就是这样做的:
Stop.select("DISTINCT line_id, direction")
除了它不会为我提供除这 2 之外的任何其他属性。我尝试了其他几个查询让它返回 id 除了 line_id 和 direction 字段(理想情况下它会返回所有列),没有运气:
Stop.select("DISTINCT line_id, direction, id")
和
Stop.select("DISTINCT(line_id || '-' || direction), id")
在这两种情况下,查询都会丢失其 distinct 子句并返回所有行。
一些很棒的家伙帮助了我,并建议使用子查询让它返回所有的 id:
Stop.find_by_sql("SELECT DISTINCT a1.line_id, a1.direction, (SELECT a2.id from stops a2 where a2.line_id = a1.line_id AND a2.direction = a1.direction ORDER BY a2.id ASC LIMIT 1) as id FROM stops a1
然后我可以提取所有 id 并执行第二次查询以获取每个站点的完整属性。
有没有办法将所有内容都包含在 1 个查询中并返回所有属性?
【问题讨论】:
-
我不确定你的要求是否有意义。要么你想要停止,要么你不想要。如果您想要停靠点,将会有更多行。如果您想在列中停止 id,请将 array_agg 包裹在子查询周围并删除限制。似乎您将在此之后进行一些查询,或者为什么只返回 stop_ids。我认为最好在问题中说明想要什么。人们可能更容易回答
-
我想要停靠点,只是我只想要每行/方向一个。因此,如果一条公交线路有 2 个方向,我希望查询返回每个方向的 1 个站点。 @pothibo 的回答是正确的,无论如何,谢谢。
标签: ruby-on-rails postgresql activerecord