SQL - ayuda mostrar dos campos

 
Vista:
sin imagen de perfil

ayuda mostrar dos campos

Publicado por efren (2 intervenciones) el 03/11/2013 02:02:28
Hola amigos, saludos a todos, espero alguien me pueda ayudar si, tengo el siguiente problema, estoy creando un proyecto algo parecido a una ptc pero con matriz estoy estancado en esto:

tengo una tabla llamada tb_users donde guardo los datos de los usuarios y esto es lo que quiero trabaja:

1.referer: que es la persona quien lo refirio

entonces en la cuenta del usuario cuando el quiera ver sus referidos se les mostraran los usuarios que en la tabla tb_users tengan su nick en el campo referer.

$lole=$_COOKIE["usNick"];// nick del usuario que consulta

$tabla = mysql_query("SELECT * FROM tb_users where referer='$lole' ORDER BY id ASC"); // selecciono todos los registros de la tabla usuarios, ordenado por nombre

mysql_close($con);
while ($row = mysql_fetch_array($tabla))


ok hasta voy bien me muestra los referidos del usuario, pero ahora necesito que tambien muestre los referidos de los referidos es decir un ejemplo y ojala me entiendan

Usuario: Efren tiene 3 referidos

1.Jose
2.maria
3Juan

a el se le muestran sus 3 referidos directos con el codigo que esta arriba, pero ahora quiero que el tambien pueda ver los referidos que tenga

Jose
Maria
Juan

supongamos que:

1.Jose tiene tambien 3 referidos, entoces el usuario efren deberia mirar asi:

usuario: Efren

1.Jose
1.1.Daniel
2.1.Carlos
3.1.Ruben
2.Maria
3.Juan

y en total serian 3 referidos directo de el mas los 3 que tiene Jose : 6 referidos, eso es lo que quiero hacer pero aun no puedo si alguien me ayuda se lo agradezco
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

ayuda mostrar dos campos

Publicado por leonardo_josue (1173 intervenciones) el 05/11/2013 18:07:40
Hola Efren...

Antes que nada deberías comenzar por comentarnos cómo es que tienes organizadas tus tablas (estructura) y cómo almacenas tu información (datos). Por lo que puedo inferir, tienes una especie de tabla recursiva, es decir, algo como esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> SELECT * FROM usuarios;
+-----------+---------------+
| idUsuario | nombreUsuario |
+-----------+---------------+
|         1 | Efren         |
|         2 | Jose          |
|         3 | Daniel        |
|         4 | Carlos        |
|         5 | Ruben         |
|         6 | Maria         |
|         7 | Juan          |
|         8 | Leonardo      |
+-----------+---------------+
8 rows in set (0.00 sec)
 
mysql> SELECT * FROM referidos;
+-----------+-------------------+
| idUsuario | idUsuarioReferido |
+-----------+-------------------+
|         1 |                 2 |
|         1 |                 6 |
|         1 |                 7 |
|         2 |                 3 |
|         2 |                 4 |
|         2 |                 5 |
|         6 |                 8 |
+-----------+-------------------+
7 rows in set (0.00 sec)


es decir, Efren (idUsuario = 1) refiere a José, Maria y Juan (idUsuariosReferidos = 2, 6, 7), a su vez Jose (idUsuario = 2) refiere a Daniel, Carlos y Rubén (idUsuariosReferidos = 3, 4, 5) y así sucesivamente... ¿Es esto correcto?

Si esto es más o menos lo que tienes, entonces hay algunas consideraciones que debes tener:

1. ¿Con qué Base de Datos estás trabajando?, este detalle es importantísimo, lamentablemente el 90% de los forista lo omiten. Aunque la mayoría de los DBMS's se basan en SQL, existen diferencias importantes en cada uno de ellos, y por ejemplo SQL Server y ORACLE poseén funciones específicas para este tipo de consultas jerárquicas. Como usas PHP puedo suponer que trabajas con MySQL, pero eso sólo Dios y tú lo saben.

2. Cuántos niveles quieres mostrar? es decir, la tabla como se plantea es recursiva:
Efren refiere a José -> José refiere a María -> María refiere a Juan -> Juan refiere a Efren -> y así volvemos a comenzar...

En tu ejemplo sólo muestras dos niveles, eso es lo que voy a considerar. Hay muchísimas formas de llegar al mismo resultado, unas más complejas que otras... insisto, depende mucho del motor que estés utilizando... una de las maneras más "simples" aunque no la mejor, es hacerlo con UNION's y subconsultas... en primer lugar pondrías la consulta casi como la tienes:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT 1 nivel, u.idUsuario padre, u.nombreUsuario
    -> FROM referidos r
    -> INNER JOIN usuarios u ON u.idUsuario = r.idUsuarioReferido
    -> WHERE r.idUsuario = 1;
+-------+-------+---------------+
| nivel | padre | nombreUsuario |
+-------+-------+---------------+
|     1 |     2 | Jose          |
|     1 |     6 | Maria         |
|     1 |     7 | Juan          |
+-------+-------+---------------+
3 rows in set (0.00 sec)


Observa que con esta consulta obtengo a TODOS LOS USUARIOS REFERIDOS POR EFREN... y que además agrego una columna con NIVEL = 1... ahora bien, para el segundo nivel NECESITO OBTENER TODOS LOS USUARIOS REFERIDOS POR JOSÉ, MARÍA O JUAN... si observas la única diferencia con respecto a la consulta de arriba es que en lugar de poner

1
2
...
WHERE r.idUsuario = 1;

debería poner

1
2
...
WHERE r.idUsuario IN (2,6,7);

o lo que es lo mismo, obtener estos id's con una subconsulta:

1
2
...
WHERE r.idUsuario IN (SELECT r.idUsuarioReferido FROM referidos r WHERE r.idUsuario = 1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> SELECT
    ->   2 nivel,  r.idUsuario padre,
    ->   CONCAT('->',u.nombreUsuario) nombreUsuario
    -> FROM referidos r
    -> INNER JOIN usuarios u ON u.idUsuario = r.idUsuarioReferido
    -> WHERE r.idUsuario IN (SELECT r.idUsuarioReferido FROM referidos r
    ->                       WHERE r.idUsuario = 1)
    -> ORDER BY padre, nivel;
+-------+-------+---------------+
| nivel | padre | nombreUsuario |
+-------+-------+---------------+
|     2 |     2 | ->Ruben       |
|     2 |     2 | ->Daniel      |
|     2 |     2 | ->Carlos      |
|     2 |     6 | ->Leonardo    |
+-------+-------+---------------+
4 rows in set (0.00 sec)

Observa dos cosas, en primer lugar cambio el 2 como nivel, ya que estos corresponden al segundo nivel, y en la columna PADRE, coloco justamente el usuario que los refiere...

Finalmente, con estas dos consultas, puedes hacer un UNION:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> SELECT 1 nivel, u.idUsuario padre, u.nombreUsuario
    -> FROM referidos r
    -> INNER JOIN usuarios u ON u.idUsuario = r.idUsuarioReferido
    -> WHERE r.idUsuario = 1
    -> UNION
    -> SELECT
    ->   2 nivel,  r.idUsuario padre,
    ->   CONCAT('->',u.nombreUsuario) nombreUsuario
    -> FROM referidos r
    -> INNER JOIN usuarios u ON u.idUsuario = r.idUsuarioReferido
    -> WHERE r.idUsuario IN (SELECT r.idUsuarioReferido FROM referidos r
    ->                       WHERE r.idUsuario = 1)
    -> ORDER BY padre, nivel
    -> ;
+-------+-------+---------------+
| nivel | padre | nombreUsuario |
+-------+-------+---------------+
|     1 |     2 | Jose          |
|     2 |     2 | ->Ruben       |
|     2 |     2 | ->Daniel      |
|     2 |     2 | ->Carlos      |
|     1 |     6 | Maria         |
|     2 |     6 | ->Leonardo    |
|     1 |     7 | Juan          |
+-------+-------+---------------+
7 rows in set (0.00 sec)


Observa la utilizad de las columnas PADRE Y NIVEL... al ordenar por estos campos, agrupa los usuarios que pertenecen a cada PADRE (los hijos se diferencían por que les agregué una -> y tienen NIVEL = 2.

Insisto, hay muchas formas de hacer esto que quieres... esta no es la manera más óptima de hacerlo, pero creo que te puede servir. Dale un vistazo y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

ayuda mostrar dos campos

Publicado por efren (2 intervenciones) el 05/11/2013 18:52:54
Hola, leo no entendi muy bien, pero veo que tu sabes muy bien de esto, quisiera por favor si puedes agregarme al correo o skype: efren_315 es que quiero desarrollar este sistema pero me falta esa parte y a mi ya se me iso muy complicado, si puedes agregarme ya hablamos a ver si llegamos a algun acuerdo para desarrollar esa parte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar