2012-08-29 46 views
0

我知道答案,我的问题有什么做的排名,只是不知道该怎么做完全是。我的发言目标是只获得5条记录,但优先考虑某个表格上的记录而非另一个表格。另一个SQL语句我不明白

我有两个表:NewsNewsToLocation

让我们假设有在新闻台4个新闻和3在满足我的要求的NewsToLocation。因为我只能选择5我要确保在News表中4得到的偏好,然后只从NewsToLocation表中选择1。我目前的查询是做相反的,我不知道如何解决它。

这里是整个查询。

SELECT 
newSpotlights.* 
FROM 
(SELECT 
    TOP 5 n.news_id, 
    n.is_spotlight, 
    n.location_id, 
    n.news_title, 
    CAST(n.news_content AS varchar(200)) AS news_content, 
    n.writing_date, 
    n.publication_date, 
    n.end_date, 
    n.alt_uri, 
    n.youtube_code, 
    n.icon_img_file, 
    n.banner_img_file 
FROM 
    (SELECT 
     n.news_id 
    FROM rcde_news n 
    WHERE n.location_id = 4 
    AND n.is_spotlight = 1 AND n.publication_date < GETDATE() AND n.end_date > GETDATE() 
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    UNION 
    SELECT 
     n.news_id 
    FROM rcde_newsToLocation ntl 
    INNER JOIN rcde_news n ON ntl.news_id = n.news_id 
    WHERE ntl.location_id = 4 
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    ) AS News 
INNER JOIN rcde_news n ON news.news_id = n.news_id 
WHERE n.is_spotlight = 1 
AND n.publication_date < GETDATE() 
AND n.end_date > GETDATE() 
ORDER BY publication_date DESC 
) AS newSpotlights 

我觉得我应该可以做一些排序最内在的查询排序,但我不知道该怎么做。我有点明白排名,但不知道我会怎么做一个UNION声明。我可以做一些简单的事情,比如在联盟的不同部分分别选择1作为等级和2作为等级,然后按等级排序?

回答

1

您只需添加1秩,2秩到查询的联合部分,然后进行排序,最后第一。

SELECT 
    TOP 5 
    n.news_id, 
    n.is_spotlight, 
    n.location_id, 
    n.news_title, 
    CAST(n.news_content AS varchar(200)) AS news_content, 
    n.writing_date, 
    n.publication_date, 
    n.end_date, 
    n.alt_uri, 
    n.youtube_code, 
    n.icon_img_file, 
    n.banner_img_file 
FROM 
    (SELECT 
     1 as rank, 
     n.news_id 
    FROM rcde_news n 
    WHERE n.location_id = 4 
    AND n.is_spotlight = 1 AND n.publication_date < GETDATE() AND n.end_date > GETDATE() 
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    UNION 
    SELECT 
     2 as rank, 
     n.news_id 
    FROM rcde_newsToLocation ntl 
    INNER JOIN rcde_news n ON ntl.news_id = n.news_id 
    WHERE ntl.location_id = 4 
    AND n.status_id = 2 /*2 = Active rcde_ItemStatus*/ 
    ) AS News 
INNER JOIN rcde_news n ON news.news_id = n.news_id 
WHERE n.is_spotlight = 1 
AND n.publication_date < GETDATE() 
AND n.end_date > GETDATE() 
ORDER BY rank DESC, publication_date DESC 
+0

这很简单。我知道它不必像我一样努力。 – Leeish

0

是的,你基本上就和您的等级观念:

select top 5 Column1, Column2 
from (
    select top 5 Column1, Column2, 1 as Rank 
    from News 
    order by SomeColumn 

    union all 

    select top 5 Column1, Column2, 2 as Rank 
    from NewsLocation 
    order by SomeColumn 
    ) x 
order by Rank 
0
SELECT 
    TOP 5 
    n.news_id 
FROM 
    (SELECT 
     1 as ranking, 
     n.news_id 
    FROM rcde_news n 
    WHERE blah blah 
    UNION 
    SELECT 
     2 as ranking, 
     n.news_id 
    FROM rcde_newsToLocation ntl 
    WHERE blah blah 

    ) AS News 
ORDER BY publication_date DESC, Ranking 
+0

我最初尝试过,但直到我看到下面的一个没有工作。必须按排名然后排序或排除错误。不过谢谢。 – Leeish