首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql左联接只从左表中选择最高的

mysql左联接只从左表中选择最高的
EN

Stack Overflow用户
提问于 2013-10-04 15:54:16
回答 2查看 2.3K关注 0票数 0

我尝试过调整来自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数的表

代码语言:javascript
复制
tagID  page_id  companyID  teamID  companyID
1510   289      16         9       16
1418   163      16         9       16

(还有我想要的其他文本字段,但这些字段不用于匹配,因此这里排除了它们)

我最初的疑问是

代码语言:javascript
复制
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 

,其中选择了两行

代码语言:javascript
复制
tagID  page_id  companyID  teamID  newsID  companyID
1510   289      16         9       0       16
1418   163      16         9       0       16

我试过了

代码语言:javascript
复制
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

代码语言:javascript
复制
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

两者都回来了

代码语言:javascript
复制
tagID  page_id  companyID  teamID  newsID  companyID
1510   289      16         9       0       NULL
1418   163      16         9       0       16

所有文本字段也为空。

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

编辑:

虽然这个解决方案返回的是最低的page_id,但它确实过滤掉了复制,幸运的是,对我来说,我需要的文本部分没有受到影响。在这里张贴希望这个部分解决方案对某人有用。

从cms_company_tags内部连接中选择*(选择companyID、companyName、page_path、MAX(page_id)作为cms_companies组MaxPageID BY cms_companies.page_id )、MaxPages ON cms_company_tags.companyID = MaxPages.companyID和cms_company_tags.page_id = MaxPages.MaxPageID和cms_company_tags.teamID =9 ORDER ( MaxPages.companyName ASC )

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 16:04:49

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

无论如何,要按公司ID和团队ID获得最高的页面ID,请尝试如下:

代码语言:javascript
复制
SELECT companyID, teamID, MAX(page_ID)
FROM cms_company_tags
GROUP BY companyID, teamID

然后,要从cms_company_tags中获取唯一的行,只需将其作为子查询连接到“根据ID设置的最高值”:

代码语言:javascript
复制
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的结果。

票数 0
EN

Stack Overflow用户

发布于 2013-10-04 16:08:46

您在server中使用过ROW_NUMBER窗口函数吗?也许你所看到的是:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19185584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档