Dada la siguiente tabla:

+----+-----------+---------+
| id | author_id | content |
+----+-----------+---------+
| 1  | 1         |         |
+----+-----------+---------+
| 2  | 2         |         |
+----+-----------+---------+
| 3  | 1         |         |
+----+-----------+---------+
| 4  | 2         | XYZ     |
+----+-----------+---------+

¿Cómo seleccionaría una lista de author_id s que solo tienen publicaciones sin contenido, sin usar subconsultas? En este caso, me gustaría una consulta que solo devuelva author_id 1.

Esto funciona, pero me pregunto si hay una manera sin tener que usar subconsultas por motivos de rendimiento.

SELECT author_id
FROM my_table
WHERE author_id NOT IN (
    SELECT author_id FROM my_table WHERE content != ''
)
GROUP BY author_id

Aquí está un violín.

1
Pete 10 may. 2019 a las 02:50

3 respuestas

La mejor respuesta

Puede filtrar los grupos usando una cláusula HAVING:

SELECT author_id
FROM my_table
GROUP BY author_id
HAVING MAX(LENGTH(content)) = 0

O puede usar JOIN para intentar encontrar cualquier fila con un contenido que no esté en blanco y solo seleccionar aquellas que no coincidan.

SELECT t1.author_id
FROM my_table AS t1
LEFT OUTER JOIN my_table AS t2 ON t1.author_id = t2.author_id
  AND LENGTH(t2.content) > 0
WHERE t2.author_id IS NULL
5
Bill Karwin 9 may. 2019 a las 23:55

Puede usar una autounión, JOIN reuniendo a los autores donde tienen contenido en un artículo y luego seleccionando solo los autores que no tienen contenido:

SELECT DISTINCT m1.author_id
FROM my_table m1
LEFT JOIN my_table m2 ON m2.author_id = m1.author_id AND m2.content != ''
WHERE m2.id IS NULL

Salida:

author_id
1

Demostración sobre dbfiddle

3
Nick 9 may. 2019 a las 23:57

También puedes usar NOT EXISTS

SELECT DISTINCT author_id
FROM my_table a
WHERE NOT EXISTS 
           (SELECT NULL
            FROM my_table b
            WHERE a.author_id = b.author_id
            AND b.content != '')
0
Abhijith Nagarajan 10 may. 2019 a las 00:05