mysql - hacer - inner join misma tabla
INNER JOIN misma mesa (6)
Creo que el problema está en su condición de JOIN
.
SELECT user.user_fname,
user.user_lname,
parent.user_fname,
parent.user_lname
FROM users AS user
JOIN users AS parent
ON parent.user_id = user.user_parent_id
WHERE user.user_id = $_GET[id]
Edición : Probablemente debería usar LEFT JOIN
si hay usuarios sin padres.
Estoy tratando de obtener algunas filas de la misma tabla. Es una tabla de usuarios: user tiene user_id
y user_parent_id
.
Necesito obtener la fila user_id
y la fila user_parent_id
. He codificado algo como esto:
SELECT user.user_fname, user.user_lname
FROM users as user
INNER JOIN users AS parent
ON parent.user_parent_id = user.user_id
WHERE user.user_id = $_GET[id]
Pero no muestra los resultados. Quiero mostrar el registro de usuario y su registro principal.
Intentemos responder a esta pregunta, con un escenario bueno y simple, con 3 tablas MySQL
, es decir, tabla de datos , tabla de color y tabla de combinación .
Primero vea los valores de la table
datos con primary key
asignada a la column
dateid :
mysql> select * from datetable;
+--------+------------+
| dateid | datevalue |
+--------+------------+
| 101 | 2015-01-01 |
| 102 | 2015-05-01 |
| 103 | 2016-01-01 |
+--------+------------+
3 rows in set (0.00 sec)
Ahora muévase a nuestra segunda table
valores coloreables con primary key
asignada a column
colorid :
mysql> select * from colortable;
+---------+------------+
| colorid | colorvalue |
+---------+------------+
| 11 | blue |
| 12 | yellow |
+---------+------------+
2 rows in set (0.00 sec)
y nuestra tercera table
ensamblaje final no tiene primary keys
y los valores son:
mysql> select * from jointable;
+--------+---------+
| dateid | colorid |
+--------+---------+
| 101 | 11 |
| 102 | 12 |
| 101 | 12 |
+--------+---------+
3 rows in set (0.00 sec)
Ahora nuestra condición es encontrar las fechas , que tienen valores de color azul y amarillo .
Entonces, nuestra consulta es:
mysql> SELECT t1.dateid FROM jointable AS t1 INNER JOIN jointable t2
-> ON t1.dateid = t2.dateid
-> WHERE
-> (t1.colorid IN (SELECT colorid FROM colortable WHERE colorvalue = ''blue''))
-> AND
-> (t2.colorid IN (SELECT colorid FROM colortable WHERE colorvalue = ''yellow''));
+--------+
| dateid |
+--------+
| 101 |
+--------+
1 row in set (0.00 sec)
Esperanza, esto ayudaría a muchos.
No sé cómo se crea la tabla, pero prueba esto ...
SELECT users1.user_id, users2.user_parent_id
FROM users AS users1
INNER JOIN users AS users2
ON users1.id = users2.id
WHERE users1.user_id = users2.user_parent_id
Quizás este debería ser el selecto (si entiendo la pregunta correctamente)
select user.user_fname, user.user_lname, parent.user_fname, parent.user_lname
... As before
Su consulta debería funcionar bien, pero debe usar el alias parent
para mostrar los valores de la tabla principal de esta manera:
select
CONCAT(user.user_fname, '' '', user.user_lname) AS ''User Name'',
CONCAT(parent.user_fname, '' '', parent.user_lname) AS ''Parent Name''
from users as user
inner join users as parent on parent.user_parent_id = user.user_id
where user.user_id = $_GET[id];
También puedes usar UNION como
SELECT user_fname ,
user_lname
FROM users
WHERE user_id = $_GET[id]
UNION
SELECT user_fname ,
user_lname
FROM users
WHERE user_parent_id = $_GET[id]