mysql左连接只从左表中选择最高

时间:2013-10-04 15:54:16

标签: mysql sql sql-server join

我尝试过调整SELECT biggest row from a LEFT JOINmysql: How to INNER JOIN a table but limit join to 1 result with the highest vote or count?的解决方案,但无法弄明白。

我正在加入两个表,正在加入的表有两个重复的行,唯一的区别是字段'page_id' - 我想要一个page_id号最高的那个

tagID  page_id  companyID  teamID  companyID
1510   289      16         9       16
1418   163      16         9       16

(还有我想要的其他文字字段,但这些字段不用于匹配,因此在此处将其排除在外)

我的原始查询是

SELECT * FROM `cms_company_tags` 
LEFT JOIN `cms_companies` ON `cms_companies`.`companyID`=`cms_company_tags`.`companyID` 
WHERE `cms_company_tags`.`teamID`='9'
ORDER BY `cms_companies`.`companyName` ASC 

选择了两行

tagID  page_id  companyID  teamID  newsID  companyID
1510   289      16         9       0       16
1418   163      16         9       0       16

我试过

Select cms_company_tags.*, cms_companies.*
From cms_company_tags
    Left Join cms_companies
        On cms_companies.companyID = cms_company_tags.companyID
            And cms_companies.page_id = (
                        Select Max( t.page_id )
                        From cms_companies As t
                        Where t.page_id = cms_company_tags.page_id
                GROUP BY cms_company_tags.tagID
                ORDER BY cms_company_tags.tagID DESC 
                        )
WHERE `cms_company_tags`.`teamID`='9'
ORDER BY `cms_companies`.`companyName` ASC

SELECT * FROM `cms_company_tags` 
LEFT JOIN `cms_companies` ON `cms_companies`.`companyID`=`cms_company_tags`.`companyID` 
AND `cms_companies`.`page_id` = (SELECT MAX(page_id) AS pageID from `cms_companies` where `cms_companies`.`page_id` = `cms_company_tags`.`page_id`)                             
WHERE `cms_company_tags`.`teamID`='9'
ORDER BY `cms_companies`.`companyName` ASC

两者都返回

tagID  page_id  companyID  teamID  newsID  companyID
1510   289      16         9       0       NULL
1418   163      16         9       0       16

所有文本字段也是NULL

我想要唯一最高的page_id。我可以使用一个重复的行,如果它是最高的那个,那么文本字段为NULL,而不是最低的那个,因为我正在得到它。


编辑:

虽然这个解决方案来自LOWEST page_id但它会过滤掉副本,幸运的是我所需的文本部分没有受到影响。在此发布,希望这个部分解决方案对某人有用

SELECT * 来自cms_company_tags 内部联接 (   SELECT companyID,companyName,page_path,MAX(page_id)AS MaxPageID   来自cms_companies   GROUP BY cms_companies.page_id )MaxPages ON   cms_company_tags.companyID = MaxPages.companyID AND   cms_company_tags.page_id = MaxPages.MaxPageID AND cms_company_tags.teamID = 9 订购MaxPages。companyName ASC

2 个答案:

答案 0 :(得分:0)

首先:你为什么要加入?您只是从左表中选择,因此左连接到另一个表不会影响结果。内部联接会影响结果(通过省略cms_companies中不存在的公司),但左联接不会。

无论如何,要按公司ID和团队ID获取最高的网页ID,请尝试以下操作:

SELECT companyID, teamID, MAX(page_ID)
FROM cms_company_tags
GROUP BY companyID, teamID

然后从cms_company_tags获取唯一行,只需加入“最高ID”作为子查询:

SELECT tagID, page_id, companyID, teamID
FROM cms_company_tags
INNER JOIN (
  SELECT companyID, teamID, MAX(page_ID) AS MaxPageID
  FROM cms_company_tags
  GROUP BY companyID, teamID
) MaxPages ON
  cms_company_tags.companyID = MaxPages.companyID AND
  cms_company_tags.teamID = MaxPages.teamID
  cms_company_tags.page_id = MaxPages.MaxPageID

此查询返回所有公司/团队的最大页面和其他信息。您可以添加WHERE teamID = 9将结果限制为第9组。

答案 1 :(得分:0)

您是否在sql server中使用了ROW_NUMBER窗口函数。 可能你正在寻找的是这个:

select * from(
select *,row_number()over(partition by companyid, teamid, newsid, companyid order by page_id desc) as num
from 'cms_company_tags'
left join 'cms_companies' on 'cms_companies'.'companyID'='cms_company_tags'.'companyID'
where 'cms_company_tags'.'teamID'='9'
)tbl
where tbl.num =1