如何仅使用连接表中的某些行来查找记录?

时间:2013-12-07 19:43:56

标签: mysql sql

我有一个有这种布局的数据库......

contracts
---------
id
name
description
# Etc...

locations
---------
id
contract_id  # FK to contracts.id
name
order_position
# Etc...

我需要在name的当前位置(以及其他contracts列同时找到合同)。

当前位置是order_position最大的位置。

换句话说,我正在尝试编写一个基于contractslocation.name返回行的查询。

通常,这只是通过location.contract_idcontracts.id的简单加入。

例如,这将是一个简单的案例,没有额外的要求......

SELECT c.*
FROM contracts c, locations l
WHERE
  c.id = l.contract_id
AND
  c.name LIKE '%bay%'
AND
  l.name LIKE '%admin%';

但附加要求是我希望将其缩小到合约的order_position值最大的位置。

有没有办法用一个查询来做到这一点?

3 个答案:

答案 0 :(得分:0)

也许

 SELECT c.name FROM contracts c JOIN locations l ON c.id=l.contract_id 
 AND c.name IN(SELECT name FROM locations 
 WHERE locations.order_position IN(SELECT MAX(order_position) FROM locations GROUP BY locations.name))

答案 1 :(得分:0)

这样的事情应该有效:

SELECT c.id,
       c.name, 
       loc2.name,
       loc2.order_position
  FROM dbo.contracts c
 INNER JOIN (
    SELECT loc.contract_id,
               MAX(loc.order_position) AS order_position
      FROM locations loc
     GROUP BY contract_id
        ) loc
    ON c.id = loc.contract_id
  LEFT JOIN dbo.locations loc2
    ON loc2.contract_id = loc.contract_id
   AND loc2.order_position = loc.order_position

答案 2 :(得分:0)

我对此进行了更多的研究,发现这解决了这个问题......

SELECT c.*
FROM contracts c, locations l
WHERE
  c.id = l.contract_id
AND
  c.name LIKE '%bay%'
AND
  l.name LIKE '%admin%'
AND l.order_position =
(
  SELECT MAX(order_position)
  FROM `locations`
  WHERE `contract_id` = c.id
);
相关问题