sql >> Base de Datos >  >> RDS >> Mysql

Selección anidada de Mysql

He agregado una respuesta a la pregunta anterior, consulte eso primero para comprenderlo.

No puedes obtenerlo de bb_ratings solo agrupándolo y pirateándolo. Obtiene Nulo porque está pensando en términos de una cuadrícula, no de conjuntos relacionales (ese es el concepto central del modelo relacional).

  1. Antes de decidir a qué tabla ir para atender su consulta, debe decidir qué desea para la estructura de su conjunto de resultados.

  2. Luego restríjalo (qué filas) con WHERE cláusula.

  3. Luego averigüe de dónde (de qué tablas) obtener las columnas. O se une a más tablas y más trabajo en WHERE cláusula; o subconsultas escalares, correlacionadas con la consulta externa.

No tienes claro lo que quieres. Parece que desea el mismo informe que la pregunta anterior, más una columna para el voto de los usuarios. Para mí, la estructura de su conjunto de resultados es una lista de boletines. Bueno, puedo obtener eso de bulletin , no es necesario ir a bulletin_like y luego tengo que AGRUPAR eso.

Si piensa en términos de conjuntos, es muy fácil, no es necesario pasar por el aro con vistas materializadas o consultas "anidadas":

SELECT name AS bulletin, 
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 1
        ) AS like,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   like = 0
        ) AS dislike,
    (SELECT COUNT(like) 
        FROM  bulletin_like bl 
        WHERE bl.bulletin_id = b.bulletin_id 
        AND   bl.user_id = {$user_d}
        AND   like = 1
        ) AS your_vote
    FROM bulletin b

Respuestas a comentarios

Tengo la sensación de que lo que dices es muy importante para mi enfoque de SQL

  1. Si, absolutamente. Si está dispuesto a aprender las cosas correctas desde el principio:

    • te ahorrará todo tipo de problemas más adelante
    • haga que sus consultas sean más eficientes
    • le permite codificar más rápido
      .
  2. Por ahora, olvídese de usar conjuntos de resultados como tablas (mucho más lento) y tablas temporales (definitivamente no son necesarias si su base de datos está normalizada). Eres mucho mejor consultar las tablas directamente. Necesitas aprender varios temas como el modelo Relacional; cómo usar SQL; cómo no usar SQL para evitar problemas; etc. Estoy dispuesto a ayudarlo y quedarme con usted por un tiempo, pero necesito saber que usted está dispuesto. Tomará un poco de ida y vuelta. Hay un poco de ruido en este sitio, así que ignoraré otros comentarios (hasta el final) y responderé solo a los tuyos.

    • deja de usar GROUP BY , está obstaculizando seriamente su comprensión de SQL. Si no puede obtener el informe que desea sin usar GROUP BY , haz una pregunta.
      .
  3. Esta pregunta publicada. Dime en qué momento te perdiste y te proporcionaré más detalles a partir de ese momento.

    • Para esta pregunta, desea una lista de boletines, con Me gusta; disgustos; y a este usuario le gusta. Es eso correcto ? ¿Has probado el código que proporcioné?
      .
  4. Miró la pregunta vinculada. Es un lío, y nadie ha abordado el problema más profundo; han respondido al problema en la superficie, de forma aislada. Ahora tienes una respuesta pero no la entiendes. Esa es una manera muy lenta de progresar.