2011-05-07 15 views
5

necesito para seleccionar todos los mensajes con todas sus etiquetas relacionadas:LIMIT/OFFSET por la columna DISTINCT

SELECT p.*, pt.name AS tag_name, pt.id AS tag_id FROM posts p 
LEFT JOIN posts_tags pt ON pt.post_id = p.id 

por lo que obtener algo como esto:

p.id | p.name | p.content | tag_name | tag_id 
    1 | Yahoo | ...  | first | 1 
    1 | Yahoo | ...  | second | 2 
    2 | Google | ...  | second | 2 
    2 | Google | ...  | third | 3 

Sé la hora de seleccionar los registros de esta manera se es posible obtener el número de registros a través de COUNT(p.id) por ejemplo, pero no descubrí cómo configurar OFFSET (cuántos registros se saltan desde el principio) y LIMIT (cuántos registros devuelven) según el ID de la publicación única.

Ahora es obvio que trabaja en el camino, que está saltando/limitar el número de registros, pero no el número de puestos reales ...

Respuesta

2

Si he entendido bien, desea que todas las filas "etiquetar" para N mensajes comenzando en el desplazamiento O:

SELECT p.*, pt.name AS tag_name, pt.id AS tag_id 
    FROM (SELECT * FROM posts ORDER BY id ASC LIMIT {N} OFFSET {O}) p 
LEFT JOIN posts_tags pt 
      ON pt.post_id = p.id 

Addendum

Aquí es una manera de d o usando DENSE_RANK para limitar simplemente por los propios mensajes:

SELECT p.id, p.name, p.content, pt.name as tag_name, pt.id AS tag_id 
    FROM (SELECT DENSE_RANK() OVER (ORDER BY id) AS dr, posts.* 
      FROM posts) p 
LEFT JOIN posts_tags pt 
      ON pt.post_id = p.id 
    WHERE dr BETWEEN {N} AND {N + O} 
2

No estoy muy familiarizado con PostgreSQL, pero (si entiendo su pregunta derecha) creo ROW_NUMBER() es el lugar adecuado para empezar. Algo como esto:

SELECT 
    Tag_Name, Tag_ID 
FROM 
    (
    SELECT P.ID, P.Name AS Tag_Name, P.Content, ROW_NUMBER() OVER (ORDER BY P.ID, PT.Tag_ID) AS RowNum 
    FROM Posts AS P LEFT JOIN Posts_Tags AS PT ON P.Post_ID = P.ID 
) AS X 
WHERE 
    RowNum BETWEEN 101 AND 200 

Esto debería hacer el truco en MS SQL, es posible que necesite ajustar la sintaxis.

+0

Upvoters, ¿ha intentado ejecutar esta consulta? Las funciones analíticas son una buena idea, pero ROW_NUMBER() proporciona el comportamiento exacto que el OP _no_ quiere. Además, la proyección de la columna está incompleta (dos cols en lugar de cinco) y PT.Tag_Id no existe, excepto como un alias en el conjunto de datos del OP. – pilcrow

Cuestiones relacionadas