Como você junta na mesma mesa, duas vezes, no mysql?

110

Eu tenho 2 mesas. Um (domínios) tem ids de domínio e nomes de domínio (dom_id, dom_url).

a outra contém dados reais, 2 das quais colunas exigem nomes de domínio PARA e DE. Portanto, tenho 2 colunas rev_dom_from e rev_dom_for, ambas armazenando o ID do nome de domínio da tabela de domínios.

Simples.

Agora preciso exibir os dois nomes de domínio na página da web. Eu sei como exibir um ou outro, por meio da consulta LEFT JOIN domínios ON reviews.rev_dom_for = domains.dom_url, e então você ecoa o dom_url, que ecoa o nome de domínio na coluna rev_dom_for.

Mas como eu faria com que ecoasse o segundo nome de domínio, na coluna dom_rev_from?


fonte

Respostas:

166

você usaria outra junção, algo assim:

SELECT toD.dom_url AS ToURL, 
    fromD.dom_url AS FromUrl, 
    rvw.*

FROM reviews AS rvw

LEFT JOIN domain AS toD 
    ON toD.Dom_ID = rvw.rev_dom_for

LEFT JOIN domain AS fromD 
    ON fromD.Dom_ID = rvw.rev_dom_from

EDITAR :

Tudo o que você está fazendo é entrar na mesa várias vezes. Veja a consulta na postagem: ela seleciona os valores das tabelas de Avaliações (apelidado de rvw), essa tabela fornece 2 referências para a tabela de Domínio (um FOR e um DE).

Neste ponto, é simples juntar à esquerda a tabela de Domínio para a tabela de Comentários. Uma vez (com alias como toD) para FOR, e uma segunda vez (alias como fromD) para FROM.

Em seguida, na lista SELECT, você selecionará os campos DOM_URL de ambos os LEFT JOINS da tabela DOMAIN, referenciando-os pelo alias da tabela para cada juntado em referência à tabela de Domínios e os alias como ToURL e FromUrl.

Para obter mais informações sobre aliasing no SQL, leia aqui .

Stephen Wrighton
fonte
5
o truque é que você identificou cada JOIN com um nome 'AS to' e 'AS from' para que possa usá-los no SELECT.
Matthew Smith,
1
usar uma palavra-chave diferente para o nome de uma tabela esclarece. além disso, use a palavra-chave "as" ao criar aliases.
TheSoftwareJedi
Perdoe-me, mas ainda não entendo como isso deveria funcionar. As 2 tabelas são: domínios (dom_id, dom_url) e comentários (rev_id, rev_dom_from, rev_dom_for). Se alguém pudesse escrever a consulta exata para que eu consiga pegar o jeito, seria ótimo, porque não tenho ideia do que tenho que editar.
1
Pense nos aliases como referências às linhas da tabela, não à própria tabela. Por analogia, em um loop como "for (i = 0; i <max; i ++)", a variável i é um valor iterativo, não o próprio loop.
Bill Karwin
Não sabia que você podia fazer isso no SQL, Gracias.
Adam F
8

Dadas as tabelas a seguir ..

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Tente este sql ... (é praticamente a mesma coisa que Stephen Wrighton escreveu acima) O truque é que você está basicamente selecionando da tabela de domínio duas vezes na mesma consulta e juntando os resultados.

Select d1.dom_url, d2.dom_id from
review r, domain d1, domain d2
where d1.dom_id = r.rev_dom_from
and d2.dom_id = r.rev_dom_for

Se você ainda está preso, seja mais específico exatamente com o que você não entende.

delux247
fonte
-1

Leia e experimente, isso o ajudará a:

Tabela 1

column11,column12,column13,column14

Mesa 2

column21,column22,column23,column24


SELECT table1.column11,table1.column12,table2asnew1.column21,table2asnew2.column21 
FROM table1 INNER JOIN table2 AS table2asnew1 ON table1.column11=table2asnew1.column21  INNER TABLE table2 as table2asnew2 ON table1.column12=table2asnew2.column22

table2asnew1 é uma instância da tabela 2 que é correspondida por table1.column11=table2asnew1.column21

e

table2asnew2 é outra instância da tabela 2 que é correspondida por table1.column12=table2asnew2.column22

Ashekur Rahman molla Asik
fonte