0

我正在尝试使用原始 SQL 查询我的数据库。我想在某个领域获得类似的对象。我还想为某个字段查询这些对象的位置关系。这是我到目前为止的 SQL:

Center.find_by_sql("SELECT * FROM Centers WHERE name ILIKE '%" + query + "%'
                    AND status = 1");

一个中心有一个位置关系,我也想查询位置字段。Location.country = 什么?我使用的数据库是 PostgreSQL 数据库,我使用 Datamapper 作为 ORM。我使用 datamapper 进行了此查询设置,但结果并不好。谁能帮我扩展这个查询以包括对Center.location国家字段的查询?

4

4 回答 4

0

你能展示一个有问题的数据库的简要模型吗?

我会从“一个中心有一个位置关系,我也想查询位置字段。Location.country = something”假设还有另一个你想要加入的表。

您的查询应该定义要返回的列(将星号替换为列标题,并可能在它们前面加上表名。)

在此处查看有关联接的更多信息。

http://www.w3schools.com/sql/sql_join.asp

于 2013-01-10T13:58:01.557 回答
0

您需要在每个表中都有一个字段,以便 SQL 知道如何连接正确的记录。我将在示例中使用 .ID,但这需要更改为可以连接两个表的任何字段(ID、SSN、TIN、ACCT 等)。

您应该将 .* 换成您需要的实际列,例如 SELECT Centers.name, Centers.status, Location.country

SELECT Centers.*, Location.country
  FROM Centers
  INNER JOIN Location
  ON Centers.ID = Location.ID
  WHERE Centers.name LIKE '%query%'
  AND Centers.status = 1
  AND Location.country LIKE '%something%'
;
于 2013-01-10T13:59:49.667 回答
0

你会为此而JOIN表。locationcenters

SELECT c.*
FROM   centers  c
JOIN   location l ON l.location_id = c.location_id
WHERE  c.name ILIKE '%query%'
AND    c.status = 1
AND    l.country = 'something'

假设您在 和 之间有 1:n 关系locationcenters这是使用外键列实现的location_id

使用准备好的语句来避免 SQL 注入。

于 2013-01-10T13:59:50.127 回答
0

这个查询应该这样做:

SELECT *
FROM Centersc c
JOIN Locations l ON l.id = c.location_id
WHERE c.name ILIKE ?
AND c.status = 1
AND l.country = ?

请注意,我已从答案中删除了所有应用程序代码,因为这只是一个 SQL 问题。

于 2013-01-10T14:03:50.213 回答