¿Cómo se une a la misma mesa, dos veces, en mysql?

110

Tengo 2 mesas. Uno (dominios) tiene identificadores de dominio y nombres de dominio (dom_id, dom_url).

el otro contiene datos reales, 2 de las cuales requieren un nombre de dominio TO y FROM. Entonces tengo 2 columnas rev_dom_from y rev_dom_for, las cuales almacenan la identificación del nombre de dominio, de la tabla de dominios.

Sencillo.

Ahora necesito mostrar ambos nombres de dominio en la página web. Sé cómo mostrar uno u otro, a través de la consulta LEFT JOIN domains ON reviews.rev_dom_for = domains.dom_url, y luego repite la dom_url, que haría eco del nombre de dominio en la columna rev_dom_for.

Pero, ¿cómo haría que se hiciera eco del segundo nombre de dominio, en la columna dom_rev_from?


fuente

Respuestas:

166

usaría otra combinación, algo así:

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 :

Todo lo que estás haciendo es unirte a la mesa varias veces. Mire la consulta en la publicación: selecciona los valores de las tablas de Reseñas (alias como rvw), esa tabla le proporciona 2 referencias a la tabla de Dominio (un FOR y un FROM).

En este punto, es muy sencillo unirse a la izquierda de la tabla Dominio a la tabla Reseñas. Una vez (con alias como toD) para el FOR, y una segunda vez (con alias como fromD) para el FROM.

Luego, en la lista SELECT, seleccionará los campos DOM_URL de ambos LEFT JOINS de la tabla DOMAIN, haciendo referencia a ellos por el alias de la tabla para cada uno unido en referencia a la tabla Domains, y alias como ToURL y FromUrl.

Para obtener más información sobre la creación de alias en SQL, lea aquí .

Stephen Wrighton
fuente
5
el truco es que ha identificado cada JOIN con un nombre 'AS to' y 'AS from' para que pueda usarlos en SELECT.
Matthew Smith
1
el uso de una palabra clave para el nombre de una tabla aclararía. además, utilice la palabra clave "as" al crear un alias.
TheSoftwareJedi
Perdóname, pero sigo sin entender cómo se supone que funciona esto. Las 2 tablas son: dominios (dom_id, dom_url) y reseñas (rev_id, rev_dom_from, rev_dom_for). Si alguien pudiera escribir la consulta exacta para que yo pueda entenderlo, sería genial, porque no tengo idea de lo que tengo que editar.
1
Piense en los alias como referencias a filas en la tabla, no a la tabla en sí. Por analogía, en un ciclo como "for (i = 0; i <max; i ++)" la variable i es un valor iterativo, no es el ciclo en sí.
Bill Karwin
No sabía que pudieras hacer esto en SQL, Gracias.
Adam F
8

Dadas las siguientes tablas.

Domain Table
dom_id | dom_url

Review Table
rev_id | rev_dom_from | rev_dom_for

Pruebe este sql ... (Es más o menos lo mismo que Stephen Wrighton escribió anteriormente) El truco es que básicamente está seleccionando de la tabla de dominio dos veces en la misma consulta y uniendo los 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

Si todavía está atascado, sea más específico con exactamente lo que no entiende.

delux247
fuente
-1

Lea esto e intente, esto le ayudará:

Tabla 1

column11,column12,column13,column14

Tabla 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 es una instancia de la tabla 2 que coincide con table1.column11=table2asnew1.column21

y

table2asnew2 es otra instancia de la tabla 2 que coincide con table1.column12=table2asnew2.column22

Ashekur Rahman molla Asik
fuente