Tengo SQL SELECT con UNION (SELECT...)

SELECT virtuemart_product_id 
FROM #__virtuemart_products 
WHERE product_special = 1
UNION
(SELECT virtuemart_product_id
 FROM #__virtuemart_product_badges
 WHERE badge = 3)

Esta selección devuelve virtuemart_product_id: 12345,54321,...,789,987: por ejemplo, los últimos ID son de tablas UNION (#__virtuemart_product_badges).

Necesito ordenar los resultados para que los ID de la tabla UNION sean los primeros (union_select_virtuemart_product_id y después first_select_virtuemart_product_id). Si intento esto:

...
UNION
    (SELECT virtuemart_product_id
     FROM #__virtuemart_product_badges AS badge
     WHERE badge = 3)
ORDER BY badge.virtuemart_product_id

El resultado es un error, por supuesto. Respectivamente, cualquier ORDER BY excepto ...ORDER BY virtuemart_product_id termina con un error.

¿Es esto posible?

Gracias

0
Lubos Belan 9 sep. 2018 a las 10:13

3 respuestas

La mejor respuesta

Podrías probar esto. Crea un valor artificial que indica de qué tabla provienen los datos y luego los ordena por ese valor antes del valor de identificación. Al cambiar el valor asignado al conjunto de datos y el orden de clasificación, puede cambiar qué valores se emiten primero:

(SELECT virtuemart_product_id, 0 AS dataset
FROM #__virtuemart_products 
WHERE product_special = 1)
UNION
(SELECT virtuemart_product_id, 1 AS dataset
 FROM #__virtuemart_product_badges
 WHERE badge = 3)
ORDER BY dataset DESC, virtuemart_product_id

Editar

Dado que existe el requisito de devolver solo una columna (virtuemart_product_id), deberá ajustar esta consulta en una subconsulta y SELECT virtuemart_product_id de ella:

SELECT virtuemart_product_id
FROM ((SELECT virtuemart_product_id, 0 AS dataset
       FROM #__virtuemart_products 
       WHERE product_special = 1)
      UNION
      (SELECT virtuemart_product_id, 1 AS dataset
       FROM #__virtuemart_product_badges
       WHERE badge = 3)
      ORDER BY dataset DESC, virtuemart_product_id) v
1
Nick 9 sep. 2018 a las 08:16

Si desea primero el resultado de la tabla de unión, primero seleccione esa tabla después de esa unión, otra tabla. Me gusta esto:-

(SELECT virtuemart_product_id
 FROM #__virtuemart_product_badges
 WHERE badge = 3)
UNION
SELECT virtuemart_product_id 
FROM #__virtuemart_products 
WHERE product_special = 1
1
vinay chhabra 9 sep. 2018 a las 07:38

Intenta hacer alguna consulta anidada:

select * from (YOUR ALL QUERY) AS p order by virtuemart_product_id
0
Arkowsky 9 sep. 2018 a las 07:25