2013-10-04 43 views
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?解決方案,但無法弄清楚。mysql左加入只選擇最高從左表

我連接兩個表,一個被連接有兩個重複的行,唯一的區別是場「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。希望在這裏張貼這部分解決方案是有用的人

SELECT * FROM cms_company_tags INNER JOIN( SELECT companyID,公司名稱,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 ORDER BY MaxPages。 companyName ASC

回答

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.

+0

真的很近,這... SELECT * FROM cms_company_tags INNER JOIN(SELECT companyID,公司名稱,MAX(PAGE_ID)AS MaxPageID FROM cms_companies GROUP BY cms_companies.companyID)MAXPAGES ON cms_company_tags.companyID = MaxPages.companyID AND cms_company_tags.page_id = MaxPages.MaxPageID AND cms_company_tags.teamID = 9 ...有效,但仍選擇最低的page_id ??? – JulianB

+0

調整你的代碼,返回最低page_id,但幸運的是我需要提取的文本字段是相同的,因此在我的特殊情況下如此作品....謝謝 – JulianB

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