簡體   English   中英

進行內部聯接時,ROW_NUMBER的結果出乎意料

[英]Unexpected results with ROW_NUMBER doing Inner Join

我建立了這個SQL請求,

SELECT 
      distinct c_users.id,
      c_photos.user_id,
      c_photos.pic_filename,
      c_users.user_first_name,
      c_users.user_last_name,
      c_users.description,
      c_users.curriculum_diploma_1,
      ROW_NUMBER() OVER(ORDER BY c_users.id ASC) AS rank
FROM
    c_users
INNER JOIN
    c_photos
ON
    c_users.id=c_photos.user_id
WHERE 
    lower(location_town) LIKE '%lille%' 
    AND
    (c_photos.pic_type='profile' OR c_photos.pic_type='photo')    
LIMIT
   9 
;

這是輸出,

輸出

rank列有一些意外的結果,我希望它是1、2、3等,而不是94、84、25等。我不知道該怎么做。

謝謝,

倫納德

如果要按特定順序生成結果,則需要按order by 我建議:

order by c_users.id 

要么

order by rank

編輯:

我不確定row_number()如何與distinct 我對group by比較滿意。 但是,就您的情況而言,我懷疑是否需要消除重復(除非用戶有兩張同名照片)。

SELECT u.id, p.user_id, p.pic_filename, u.user_first_name, u.user_last_name,
       u.description, u.curriculum_diploma_1,
       ROW_NUMBER() OVER (ORDER BY u.id ASC) AS rank
FROM c_users u INNER JOIN
     c_photos p
     ON u.id = p.user_id
WHERE lower(location_town) LIKE '%lille%' AND
      p.pic_type in ('profile', 'photo')
LIMIT 9 ;

你可以加:

GROUP BY u.id, p.user_id, p.pic_filename, u.user_first_name, u.user_last_name,
         u.description, u.curriculum_diploma_1 

如有必要。

with CTE as
(
SELECT 
      distinct c_users.id,
      c_photos.user_id,
      c_photos.pic_filename,
      c_users.user_first_name,
      c_users.user_last_name,
      c_users.description,
      c_users.curriculum_diploma_1,
      ROW_NUMBER() OVER(ORDER BY c_users.id ASC) AS rank
FROM
    c_users
INNER JOIN
    c_photos
ON
    c_users.id=c_photos.user_id
WHERE 
    lower(location_town) LIKE '%lille%' 
    AND
    (c_photos.pic_type='profile' OR c_photos.pic_type='photo')    
)
select *
from CTE
where rank <=9

要么將其打包在CTE /查詢中,然后使用row_number,要么按新列排序(根據Gordon的回答),以使限制達到預期效果。

引起這種情況的獨特聲明。 您可以嘗試以下方法:

SELECT *, ROW_NUMBER() OVER(ORDER BY c_users.id ASC) AS rank from (
SELECT 
      distinct c_users.id,
      c_photos.user_id,
      c_photos.pic_filename,
      c_users.user_first_name,
      c_users.user_last_name,
      c_users.description,
      c_users.curriculum_diploma_1

FROM
    c_users
INNER JOIN
    c_photos
ON
    c_users.id=c_photos.user_id
WHERE 
    lower(location_town) LIKE '%lille%' 
    AND
    (c_photos.pic_type='profile' OR c_photos.pic_type='photo')    
    ) as data
LIMIT
   9 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM