¿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?

mysql 

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í .


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.


-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.