2017-07-20 3 views
0

ich diese SQL-Anfrage gebaut,Unerwartete Ergebnisse mit ROW_NUMBER Inner Join tun

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 
; 

Dies ist der Ausgang,

output

Der Rang Spalte einige unerwartete Ergebnisse hat, ich will es sein 1, 2, 3 usw. und nicht 94, 84, 25 usw. Ich kann nicht herausfinden, wie es geht.

Danke,

Leonard

Antwort

1

Wenn Sie die Ergebnisse in einer bestimmten Reihenfolge möchten, benötigen Sie einen order by. Ich würde empfehlen:

order by c_users.id 

oder

order by rank 

EDIT:

Ich bin nicht sicher, wie row_number() Arbeiten mit distinct. Ich bin wohler mit group by. In Ihrem Fall bezweifle ich jedoch, dass doppelte Eliminierung erforderlich ist (es sei denn, ein Benutzer hat zwei Fotos mit demselben Namen).

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 ; 

können Sie hinzufügen:

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

Falls erforderlich.

0
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 

Entweder Paket, um es in einer CTE/Abfrage und verwenden Sie die row_number, oder bestellen Sie Ihre neue Spalte (laut Gordon Antwort) für die Grenze wie erwartet zu funktionieren.

0

Die eindeutige Aussage verursacht dies. Sie könnten dies versuchen:

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