0

我知道我的问题的答案与排名有关,只是不知道该怎么做。我声明的目标是只获取 5 条记录,但优先于某个表中的记录。

我有两张桌子: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 作为等级,然后按等级排序吗?

4

3 回答 3

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
于 2012-08-29T14:54:49.067 回答
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
于 2012-08-29T14:54:08.943 回答
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
于 2012-08-29T14:54:23.810 回答