2012-05-14 7 views
6

Tengo una tabla y quiero obtener 15 valores con un pedido y 15 con otro orden. El objetivo es obtener exactamente 30 valores distintos.
Este es mi código:Seleccionar con UNION pero limitar cada subconsulta y recibir valores distintos

(SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15) 
    UNION All 
(SELECT * FROM table1 WHERE criteria ORDER BY date_upload DESC LIMIT 15) 

sé cómo llevar a cabo la tarea con dos consultas (con NO EN), pero hay una manera de hacer que en una consulta?

+1

'UNION ALL' no necesariamente le dará 30 * valores * distintos (cada una de las dos consultas podría incluir el mismo registro); use en cambio 'UNION DISTINCT' (u omita' DISTINCT' ya que es el valor predeterminado). Para limitar a * exactamente * 30 resultados, primero debe decidir de cuál de las dos consultas se obtendrá un registro adicional si los 15 primeros de cada intersección. – eggyal

+0

Dice _distinct values_ pero está devolviendo todas las columnas en table1. ¿Hay solo una columna? – Bridge

+2

¿Qué sucede si ambas subselects devuelven el mismo registro? ¿Tendrás 29 registros como resultado? ¿O tendrá 30 registros (de qué tabla obtendrá un registro adicional?) –

Respuesta

1

Si es necesario, reemplace "id" con el nombre de su clave primaria:

(SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15) 
UNION 
(SELECT * FROM table1 WHERE criteria AND id NOT IN(SELECT id FROM table1 WHERE criteria LIMIT 15) ORDER BY date_upload DESC LIMIT 15) 

Esta consulta :
- selecciona los 15 primeros registros que coinciden con los criterios ordenados por vistas
- selecciona los 15 primeros criterios coincidentes y no en el primer SELECCIONAR, y los ordena por fecha_upload

Con esta consulta, se asegurará de obtener 30 registros cada vez que haya 30 registros distintos disponibles en la tabla1.

0

No estoy muy seguro, si es lo que está buscando, pero siempre puede ajustar esto en una subselección y usar DISTINCT en su SELECCIÓN externa para filtrar los resultados. Por supuesto, no hay garantía de que obtendrá 30 resultados de búsqueda para la espalda:

SELECT DISTINCT * FROM (
    (SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15) 
    UNION All 
    (SELECT * FROM table1 WHERE criteria ORDER BY date_upload DESC LIMIT 15) 
) AS a 

podría establecer un límite superior para sus subselects y añadir un límite adicional para su exterior de selección, aunque ...

+0

Tuve esta idea, aunque si obtengo 29 registros, tendré que realizar una consulta bastante pesada con "NOT IN (id1, id2, ..., id29)" – lvil

+0

tal vez no entendí completamente el problema antes.El problema es que con una unión/unión distinta (distinta) no obtendrás ningún resultado de tu segunda selección, ¿verdad? – aurora

+0

No, es solo que con una unión distinta puedo obtener menos de 30 registros. – lvil

0

UNION ALL listará los registros duplicados, en lugar de jugar con Distinct y UNION ALL. Pruebe con "UNION" que le da un valor distintivo.

¡Pruebe esto!

SELECT TOP 15 * FROM tabla1 UNIÓN SELECT TOP 15 * FROM tabla1 ORDER BY date_upload

0
WITH combined 
AS 
(
    SELECT * from table1 
    union 
    SELECT * from table2 
) 
SELECT TOP 30 * FROM combined ORDER BY date_uploaded 

NOTA: no es buena idea usar * con UNION. Es mejor listar los campos.

+0

Esto no es SQL Server: s –

Cuestiones relacionadas