我尝试过调整来自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所有文本字段也为空。
我想要唯一最高的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 )
发布于 2013-10-04 16:04:49
首先:你为什么要加入?您只是从左边的表中进行选择,所以左加入到另一个表不会影响结果。内部连接会影响结果(通过省略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-04 16:08:46
您在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 =1https://stackoverflow.com/questions/19185584
复制相似问题