2013-05-22 44 views
2

我有以下查询:如何通过不同的过滤结果进行翻页?

SELECT DISTINCT TOP 20 
    f.id_service as f_id_service, 
    f.id_city as f_id_city, 
    f.name as f_name, 
    f.address as f_address, 
    f.business as f_business, 
    f.web as f_web, 
    f.phone as f_phone, 
    f.id_firm as f_id_firm 
FROM 
    Firm f 
     left join 
    Price p ON p.id_service = f.id_service 
     AND p.id_city = f.id_city 
     AND p.id_firm = f.id_firm 
WHERE 
    f.blocked = '0' 
     AND (f.name LIKE 'авто%' 
     OR f.phone LIKE 'авто%') 
     AND (f.phone != '' OR f.address != '') 
     AND f.id_city = '73041' 
     AND f.dogovor = '1' 
ORDER BY f.name ASC 

该查询显示TOP 20行具有独特f.name

当我需要选择下一个20行具有独特f.name我使用一个查询:

SELECT DISTINCT TOP 20 
    f.id_service AS f_id_service, 
    f.id_city AS f_id_city, 
    f.name AS f_name, 
    f.address AS f_address, 
    f.business AS f_business, 
    f.web AS f_web, 
    f.phone AS f_phone, 
    f.id_firm AS f_id_firm 
FROM 
    Firm f 
     LEFT JOIN 
    Price p ON p.id_service = f.id_service 
     AND p.id_city = f.id_city 
     AND p.id_firm = f.id_firm 
WHERE 
    f.name NOT IN (SELECT DISTINCT TOP 20 
      f.name 
     FROM 
      Firm f 
     WHERE 
      f.blocked = '0' 
       AND (f.name LIKE '????%' 
       OR f.phone LIKE '????%') 
       AND (f.phone != '' OR f.address != '') 
       AND f.id_city = '73041' 
     ORDER BY f.name ASC) 
     AND f.dogovor = '1' 
     AND f.blocked = '0' 
     AND (f.name LIKE '????%' 
     OR f.phone LIKE '????%') 
     AND (f.phone != '' OR f.address != '') 
     AND f.id_city = '73041' 
     AND f.dogovor = '1' 
ORDER BY f.name ASC 

但我看到在最后一个查询中,我查询了从第一个查询中选择具有唯一f.name的行。

例如:

结果第一查询(选择TOP 20行): first query

结果第二个查询(选择NEXT TOP 20行): second query

你怎么能在第二看图像第二个查询具有来自第一个图像的行(结果第一个查询)。

请告诉我,哪里错误,怎么写对不对?

+0

嘿改变公司表的别名,然后尝试 – Strik3r

+0

OFFSET(在MySQL - 限制)只有在SQL Server 2012. – Devart

+0

@Devart没有意识到这一点。感谢您的信息。因为我的解决方案是无用的。 – Bryan

回答

1

尝试这一个 -

SELECT DISTINCT TOP 20 
    f.id_service AS f_id_service, 
    f.id_city AS f_id_city, 
    f.name AS f_name, 
    f.[address] AS f_address, 
    f.business AS f_business, 
    f.web AS f_web, 
    f.phone AS f_phone, 
    f.id_firm AS f_id_firm 
FROM dbo.Firm f 
WHERE f.blocked = '0' 
    AND (f.name LIKE 'авто%' OR f.phone LIKE 'авто%') 
    AND f.phone + f.[address] != '' 
    AND f.id_city='73041' 
    AND f.dogovor='1' 
ORDER BY f.name 


SELECT * 
FROM (
    SELECT DISTINCT 
     f.id_service AS f_id_service, 
     f.id_city AS f_id_city, 
     f.name AS f_name, 
     f.[address] AS f_address, 
     f.business AS f_business, 
     f.web AS f_web, 
     f.phone AS f_phone, 
     f.id_firm AS f_id_firm, 
     row_id = ROW_NUMBER() OVER (ORDER BY f.name) 
    FROM dbo.Firm f 
    WHERE f.blocked = '0' 
     AND (f.name LIKE 'авто%' OR f.phone LIKE 'авто%') 
     AND f.phone + f.[address] != '' 
     AND f.id_city='73041' 
     AND f.dogovor='1' 
) d 
WHERE d.row_id BETWEEN 21 AND 40 
+0

并且不需要'LEFT JOIN价格p'。 – Devart

0

您正在使用哪个归类?也许这就是为什么字符串没有被你的 '排除的原因'其中f.name不在'子句中

当你正在选择什么似乎是表的ID时,你可以不用'Distinct',这个将允许您通过ID过滤前20条记录。

WHERE f.id_service NOT IN( SELECT TOP 20 f.id_service从公司F WHERE f.blocked = '0' ......

+0

不,我不能使用id,因为嗨不存在(id_serveice不使用) –

+0

我认为泰德的建议是第一件要检查的 - 添加'dogovor = 1'到not in子句中,看看是否有效。 – JamieA

0

首先,它可能是语言不通,但我们很清楚,你的拳头查询不会显示唯一的f.name,而是所有列的唯一组合。

另外,以这种方式使用TOP和DISTINCT是一个非常糟糕的主意。没有办法确定你会得到

最后您的NOT IN子句丢失AND f.dogovor='1'