Pergunta

Eu sei que eu vou descer votos, mas eu tenho que ter certeza se isso é lógico ou não.

Eu tenho três tabelas A, B, C. B é uma tabela usada para fazer um relacionamento muitos-muitos entre A e C. Mas a coisa é que A e C também estão relacionadas diretamente em um 1-muitos

Um cliente adicionado o seguinte requisito:

Obter a informação a partir da Tabela B interior juntar com A e C, e na mesma consulta relacionar A e C em um um-muitos

Algo como:

alt texto http://img247.imageshack.us/img247/7371/74492374sa4 .png

Eu tentei fazer a consulta, mas sempre tem 0 linhas de volta. O cliente insiste que eu possa cumprir a exigência, mas eu duvido. Quaisquer comentários?

PS. Eu não tinha um título mais descritivo, todas as idéias?

UPDATE: Graças à RCAR, em alguns casos, isso pode ser lógico, a fim de ter um histórico de todas as classes um aluno tomou (supondo que o aluno só pode ter uma classe de cada vez)

UPDATE: Há uma mesa para contatos, uma tabela com as informações de cada contato, e a tabela de relacionamento. Para obter as informações de um contato que eu tenho que fazer uma relação 1: 1 com a informação, e cada contato pode ter como e um livro de endereços com; é por isso que o relacionamento muitos-muitos é implementado.

A idéia completa é o de obter o nome do contato e seu livro de endereços. Agora que eu tenho idéia do cliente ... Eu estou tendo problemas com a consulta, basicamente, eu estou tentando usar a consulta que jdecuyper escreveu, mas como ele adverte, recebo nenhuma parte traseira de dados

Foi útil?

Solução

Eu estou supondo que s.id_class indica classe atual do aluno, ao contrário de aulas que ela tomou no passado.

A solução mostrada pelas obras RCAR, mas repete o c1.className em cada linha.

Aqui está uma alternativa que faz a informação não repita e ele usa um a menos participar. Você pode usar uma expressão para comparar s.id_class ao c.id_class atual combinado via tabela de mtm.

SELECT s.name, c.className, (s.id_class = c.id_class) AS is_current
FROM s JOIN many_to_many AS mtm ON (s.id_student = mtm.id_student)
  JOIN c ON (c.id_class = mtm.id_class);

Assim is_current será de 1 (true) em uma linha, e 0 (falso) em todas as outras linhas. Ou você pode produzir algo mais informativo utilizando uma construção CASE:

SELECT s.name, c.className, 
  CASE WHEN s.id_class = c.id_class THEN 'current' ELSE 'past' END AS is_current
FROM s JOIN many_to_many AS mtm ON (s.id_student = mtm.id_student)
  JOIN c ON (c.id_class = mtm.id_class);

Outras dicas

Este é um cenário factível. Você pode participar de uma mesa duas vezes em uma consulta, geralmente atribuindo-lhe um alias diferente para manter as coisas em linha reta.

Por exemplo:

SELECT s.name AS "student name", c1.className AS "student class", c2.className as "class list"
FROM s
JOIN many_to_many mtm ON s.id_student = mtm.id_student
JOIN c c1 ON s.id_class = c1.id_class
JOIN c c2 ON mtm.id_class = c2.id_class

Isto lhe dará uma lista de nomes de todos os alunos e as classes 'hardcoded' com todas as suas classes da tabela many_to_many.

Dito isto, este esquema não faz sentido lógico. Pelo que eu pude perceber, você quer que os alunos ser capaz de ter várias classes, para que a mesa de many_to_many deve ser o lugar onde você gostaria de encontrar as classes associadas com um estudante. Se as entradas id_class utilizados na tabela s são distintos daqueles em many_to_many (por exemplo, se s.id_class refere-se a, por exemplo, atribuições de classe homeroom que só aparecem nessa tabela, enquanto many_to_many.id_class refere-se a classes de crédito e exclui sala de aula classes), você vai ser melhor divisão c em duas tabelas em seu lugar.

Se esse não é o caso, eu tenho dificuldade em entender por que você gostaria de uma classe programado para a mesa de s.

EDIT: Só vi o seu comentário de que este era um esquema inventado para dar um exemplo. Em outros casos, esta poderia ser uma maneira sensata de fazer as coisas. Por exemplo, se você quiser manter o controle de locais da empresa, você pode ter uma tabela Company, uma tabela Locations, e uma mesa de Países. A tabela a empresa pode ter um 1-muitos link para países onde você iria manter o controle de país sede de uma empresa, mas uma relação muitos-para-muitos link através Locais onde você manter o controle de todos os lugares, a empresa tem uma loja.

Se você pode dar informações reais sobre o que o esquema realmente representa para o seu cliente, pode ser mais fácil para nós para descobrir se é lógico, neste caso ou não.

Talvez seja a falta de cafeína, mas não posso conceber uma razão legítima para querer fazer isso. No exemplo que você deu, você tem alunos, aulas e uma tabela que relaciona os dois. Se você pensar sobre o que você quer a consulta para fazer, na planície Inglês, certamente ele tem que ser conduzido por qualquer tabela de student ou a tabela de class. ou seja

  • selecione todas as classes que são frequentadas por estudantes 1245235
  • selecione todos os alunos que frequentam classe 101

Você pode explicar a exigência de melhor? Se não, diga ao seu cliente que chupar-lo. Ter um relacionamento entre alunos e classes diretamente (A e C), parece ser pura loucura, você já tem a tabela B que faz isso ...

Tenha em mente que o relacionamento um-para-muitos podem ser representados por meio de muitos-para-muitos, a maioria simplesmente adicionando um campo de lá para indicar o tipo de relacionamento. Então você pode ter um registro "atual" e qualquer número de ones "Histórico".

Foi o cliente "exigência" formulada como dada, pelo caminho? Eu acho que eu estaria olhando para redefinir minha relação com eles se assim for: eles devem estar me dizendo "o que" eles querem (o ideal é o que, em linguagem domínio do negócio, o seu problema é) e deixando o "como" para mim. Se eles sabem exatamente como a coisa deve ser implementada, então eu estaria inclinado a abrir o código-fonte em um editor e deixá-los a ele!

Não parece fazer sentido. A consulta como:

SELECT * FROM relAC RAC
  INNER JOIN tableA A ON A.id_class = RAC.id_class 
  INNER JOIN tableC C ON C.id_class = RAC.id_class 
    WHERE A.id_class = B.id_class

poderia gerar um conjunto de dados, mas inconsistente. Ou talvez estamos perdendo alguma parte importante da informação sobre o conteúdo e as relações desses 3 mesas.

Eu, pessoalmente, nunca ouvi uma exigência de um cliente que soaria como:

Obter as informações da Tabela B interior juntar com A e C, e em a mesma consulta relacionar A e C numa um-muitos

Parece que é o que você traduziu o requisito de. você pode especificar a exigência na planície Inglês, como o que resulta seu cliente quer entrar?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top