Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Seleção Aninhada do Mysql


Eu adicionei uma resposta à pergunta anterior, por favor, consulte-a primeiro, para compreensão.

Você não pode obtê-lo em bb_ratings sozinho agrupando-o e hackeando-o. Você obtém Null porque está pensando em termos de uma grade, não de conjuntos relacionais (esse é o conceito central do Modelo Relacional).

  1. Antes de decidir para qual(is) tabela(s) ir, para atender sua consulta, você precisa decidir o que deseja para a estrutura do seu conjunto de resultados.

  2. Em seguida, restrinja (quais linhas) com o WHERE cláusula.

  3. Em seguida, descubra de onde (quais tabelas) obter as colunas. Ou se junta a mais tabelas e mais trabalho no WHERE cláusula; ou subconsultas escalares, correlacionadas com a consulta externa.

Você não está claro sobre o que você quer. Parece que você quer o mesmo relatório da pergunta anterior, além de uma coluna para o voto dos usuários. Para mim, a estrutura do seu conjunto de resultados é uma lista de boletins. Bem, eu posso pegar isso no bulletin , não é necessário acessar bulletin_like e então tem que GROUP isso.

Se você pensa em termos de conjuntos, é muito fácil, não há necessidade de pular aros com visualizações materializadas ou consultas "aninhadas":
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

Respostas a comentários

Tenho a sensação de que o que você está dizendo é muito importante para a forma como abordo o SQL

  1. Sim absolutamente. Se você estiver disposto a aprender as coisas certas de antemão, ele irá:
    • poupar todos os tipos de problemas mais tarde
    • torne suas consultas mais eficientes
    • permite que você codifique mais rápido
      .

  2. Por enquanto, esqueça o uso de conjuntos de resultados como tabelas (muito mais lentas) e tabelas temporárias (definitivamente não necessárias se seu banco de dados for Normalizado). Você é muito melhor consultar as tabelas diretamente. Você precisa aprender vários assuntos como o modelo Relacional; como usar SQL; como não usar SQL para evitar problemas; etc. Estou disposto a ajudá-lo e ficar com você por um tempo, mas preciso saber se você está disposto. Vai demorar um pouco de ida e volta. Há um pouco de barulho neste site, então vou ignorar outros comentários (até o final) e responder apenas ao seu.
    • parar de usar GROUP BY , está prejudicando seriamente sua compreensão do SQL. Se você não conseguir obter o relatório desejado sem usar GROUP BY , faça uma pergunta.
      .

  3. Esta pergunta postada. Deixe-me saber em que ponto você se perdeu, e eu fornecerei mais detalhes a partir desse ponto.
    • Para esta pergunta, você quer uma lista de boletins, com curtidas; não gosta; e isso os usuários gostam. Isso está correto? Você tentou o código que eu forneci?
      .
  4. Olhei para a pergunta vinculada. É uma bagunça, e ninguém abordou o problema mais profundo; eles responderam ao problema na superfície, isoladamente. Agora você tem uma resposta, mas não a entende. Essa é uma maneira muito lenta de progredir.