sql: ¿Cómo obtener todos los elementos que pertenecen a un grupo donde algunos elementos de este grupo satisfacen una condición?

CorePress2024-01-25  10

Estoy comenzando con SQL y PostgreSQL y tengo esta pregunta:

¿Cómo puedo obtener todos los elementos de un grupo donde solo algunos cumplen una condición?

Por ejemplo:

+________________________+
|id| group_id |    name  |
+------------------------+
| 1|     1    |   FOOD   |
--------------------------
| 2|     1    |   SNACK  |
--------------------------
| 3|     2    |   SODA   |
--------------------------
| 4|     1    |CHOCOLATE |
--------------------------

SELECT id FROM table WHERE any in group_id name LIKE 'FOOD%'

Me gustaría recuperar 1,2,4 ya que pertenecen a group_id donde uno de los elementos es LIKE 'FOOD%'.

No puedo recuperarlos a través de group_id ya que tengo diferentes bases de datos donde cambia group_id, y a veces el group_id de mi interés es 1,2... Lo único que es igual en todas las BD es el hecho de que estoy interesado en el group_id donde el nombre LIKE 'FOOD%'.

Dado que parece que las respuestas dadas resolvieron exitosamente su problema, acepte una. Aceptar la respuesta ayudará a futuros interrogadores que tengan el mismo problema. Por favor, no deje activa una pregunta con una respuesta satisfactoria.

Asegurador

28/03/2021 a las 22:40



------------------------------------

Puedes obtener todos los group_ids que necesitas en los resultados con:

SELECT group_id FROM tablename WHERE name LIKE 'FOOD%'

Utilízalo en tu consulta con el operador IN:

SELECT * 
FROM tablename
WHERE group_id IN (SELECT group_id FROM tablename WHERE name LIKE 'FOOD%')

0



------------------------------------

Puedes utilizar existe:

select t.*
from t
where exits (select 1
             from t t2
             where t2.group_id = t.group_id and t2.name like 'FOOD%'
            );

También te puede resultar conveniente combinar todos los alimentos en una sola fila por grupo:

select group_id,
       array_agg(name order by name)
from t
group by group_id
having count(*) filter (where name like 'FOOD%') > 0;

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare