Pregunta

Tengo un problema, la formulación de una consulta de MySQL para hacer la siguiente tarea, aunque he visto la misma pregunta que aquí se analizan, son lo suficientemente diferentes a las de éste a snooker mis intentos de transposición.El problema es (relativamente) simple para el estado.Tengo tres tablas, 'miembros', 'dog_shareoffered' y 'dog_sharewanted'.Los miembros puede tener cero, uno o más anuncios de cosas que quieres vender o quieres comprar, y los datos se almacenan en el correspondiente ofrecidos o quería tabla, junto con la identificación de los miembros que han colocado el anuncio.La columna 'id' es única para el miembro, y común a las tres tablas.La consulta que quiero es preguntar cuántos miembros NO han puesto un anuncio en cualquiera de las tablas.

He intentado de varias maneras de hacer esta.Lo más cercano que puedo conseguir es una consulta que no choque!(Yo no soy un usuario experto, por cualquier medio).La siguiente, he elaborado a partir de lo que he recogido a partir de otros ejemplos, pero devuelve cero filas, donde sé que el resultado debe ser mayor que cero.

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

Esta consulta se ve agradablemente simple de entender, a diferencia de la 'combinación' he visto pero supongo que tal vez lo que necesito algún tipo de combinación, pero, ¿cómo sería eso en este caso?

¿Fue útil?

Solución

Si quieres no hay anuncios en ya sea la tabla, entonces el tipo de consulta que deseas es:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

Para seleccionar los identificadores de otras tablas:

SELECT id
FROM <othertable>

Por lo tanto:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

He añadido el 'SELECT DISTINCT' porque uno de los miembros puede poner en muchos anuncios, pero solo hay una identificación. Yo solía tener una SELECT DISTINCT en las subconsultas anterior, pero como comentarios de abajo mención, esto no es necesario.

Si quería evitar una sub-consulta (un posible aumento de rendimiento, en función..) usted podría utilizar un poco a la IZQUIERDA se Une:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

¿Por qué funciona esto:

Se lleva a la mesa members y se une a las otras dos tablas en la id columna.El LEFT JOIN significa que si existe un miembro en el members mesa, pero no la tabla nos estamos uniendo a (por ejemplo, dog_shareoffered), entonces la correspondiente dog_shareoffered las columnas se han NULL en ellos.

Así, la WHERE condición selecciona las filas donde hay una NULL id en ambos dog_shareoffered y dog_sharewanted, lo que significa que hemos encontrado id members sin identificador correspondiente en las otras dos tablas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top