0

我已经尝试从SELECT maximum row from a LEFT JOINmysql 中调整解决方案:How to INNER JOIN a table but limit join to 1 result with the most 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。如果文本字段是最高的而不是最低的,我可以忍受文本字段的重复行。


编辑:

虽然这个解决方案返回了 LOWEST page_id,但它确实过滤掉了重复项,幸运的是,我需要的文本部分没有受到影响。在这里发帖希望这个部分解决方案对某人有用

SELECT * FROM cms_company_tags INNER JOIN ( SELECT companyID, companyName, page_path, MAX(page_id) AS MaxPageID FROM 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 订购。companyNameASC

4

2 回答 2

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。

于 2013-10-04T16:04:49.430 回答
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
于 2013-10-04T16:08:46.757 回答