我已经尝试从SELECT maximum row from a LEFT JOIN和mysql 中调整解决方案: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 订购。companyName
ASC