我尝试过调整SELECT biggest row from a LEFT JOIN和mysql: 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
答案 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