Foros del Web » Programando para Internet » PHP »

Eliminar valores de un array / Listar array / MySQL

Estas en el tema de Eliminar valores de un array / Listar array / MySQL en el foro de PHP en Foros del Web. Hola, seguro que ya han tratado este tema pero buscando he encontrado de todo menos lo que buscaba. Yo tengo una tabla en MySQL con ...
  #1 (permalink)  
Antiguo 23/12/2012, 13:48
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Eliminar valores de un array / Listar array / MySQL

Hola, seguro que ya han tratado este tema pero buscando he encontrado de todo menos lo que buscaba.
Yo tengo una tabla en MySQL con 2 columnas, llamemoslas a y b.
Se trata de una lista de amistades de una red social. En a se encuentran los usuarios que enviaron las petición y en b los usuarios de destino.
Lo que necesito es obtener una lista de todos los amigos de un usuario.
Actualmente lo que estoy haciendo son dos consultas separadas a cada columna y luego las junto en un solo array pero me gustaría hacerlo en una sola consulta.
Eso lo puedo hacer con un "SELECT a,b FROM amistades WHERE a = 'id_usuario' XOR b = 'id_usuario'" lo cual me daría un array con dos columnas, a y b.
A partir de ahí la idea sería juntar esas dos columnas del array en una sola y quitar el id_usuario del propio usuario para poder proceder a listar los amigos del usuario.
Segundo problema, esta vez para listar el array. Supongamos que ya tengo un array con todos los ids de los amigos del usuario y tengo que listarlo. El id, que es lo que habrá en el array, no me sirve, así que tengo que realizar un bucle foreach que consulte cada nombre de usuario a partir de cada id del array para poder listar en la pantalla del cliente los nombres de sus amigos. Eso es lo que hago actualmente, lo cual me parece muy mal optimizado y estoy seguro de que hay alguna forma de hacer todo de golpe sin bucles de consultas a MySQL que reducen el rendimiento.
Espero que me puedan ayudar, gracias,
  #2 (permalink)  
Antiguo 23/12/2012, 17:47
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 8 meses
Puntos: 1517
Respuesta: Eliminar valores de un array / Listar array / MySQL

Hmm, esto debe ser uno a muchos. En una tabla tienes el listado de las personas y en otra una tabla con varias columnas y entre ellas una que diga user1 y otra user2 (o como quieras llamarla, es solo un ejemplo lo que te digo). Solo tienes que verificar antes los usuarios con algo así
Código PHP:
Ver original
  1. $qry = 'SELECT SUM(counter) finalCounter FROM (
  2.  ( SELECT COUNT(*) counter FROM table1 WHERE user1 = "' . $currentUser. '" AND user2 = "' . $friend . '" )
  3.  UNION
  4.  ( SELECT COUNT(*) counter FROM table1 WHERE user1 = "' . $friend. '" AND user2 = "' . $currentUser. '" )
  5. ) t1';
Si te fijas la idea es buscar tanto en user1 como en user2 y viceversa. Luego haces una verificación al valor a ver si es mayor a 0, si es así entonces ya existe esa amistad.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 24/12/2012, 05:52
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Respuesta: Eliminar valores de un array / Listar array / MySQL

Sorry, creo que me expliqué mal.
Tengo una tabla llamada amistades, que tiene 3 columnas
id_usuario_origen | id_usuario_destino | estado
Luego tengo otra tabla llamada usuarios, imagina que tiene estas dos columnas:
id_usuario | nombre_usuario
Ahora imagina que el usuario quiere ver su lista de amigos, entonces tengo que consultar en la tabla amistades todos los id_usuario que tengan una relación con el usuario mismo y que en estado ponga 'aceptado'
Luego para listar definitivamente la lista de amigos tengo que hacer un bucle que lea uno a uno el nombre del usuario apartir del id de la tabla usuarios, para que le salga en la pantalla 'Pepito' y no su id '2s4m6mo23' por ejemplo.
  #4 (permalink)  
Antiguo 24/12/2012, 06:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Con un JOIN puedes hacerlo:
http://dev.mysql.com/doc/refman/5.0/es/join.html
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 24/12/2012, 07:02
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Respuesta: Eliminar valores de un array / Listar array / MySQL

Eso ya lo sé, ¿Pero cómo? Gracias
  #6 (permalink)  
Antiguo 24/12/2012, 07:11
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

¿Leíste el enlace? ¿Hay algo en específico que no te queda claro? Intenta, luego nos comentas en qué parte no logras avanzar.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #7 (permalink)  
Antiguo 24/12/2012, 07:56
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Respuesta: Eliminar valores de un array / Listar array / MySQL

Mira no es por faltar el respeto ni nada por el estilo, pero es por gente como tú que los foros se vuelven una puta mierda, y te lo dice un administrador de un foro.
La gente, entre la que me incluyo, sabe que en Internet hay un amplio mundo de guías, manuales, posts y miles de artículos a su disposición que pueden ayudarle a solucionar sus problemas y dudas. Tan sólo tienen que usar Google y pensar un poco.
Cuando uno no encuentra una solución a su problema y necesita una ayuda específica, es cuando recurre a los foros, dónde lo normal es que los usuarios de este ayuden a las personas como puedan, porque si no simplemente no necesitarían foros.
Luego nos encontramos a gente que pega enlaces como tu has hecho o dice este tema ya ha sido tratado o dice busca en google o dice no te vamos a dar todo hecho.
¿Qué pasa cuando sucede esto? Que el usuario que ha posteado la pregunta se queda sin saber la solución y pensando que eres un borde. Pero no sólo eso, si no que también cualquier otro usuario que tenga la misma duda y encuentre este hilo en Google habrá perdido su tiempo tras leer todo y no encontrar lo que buscaba.
Ya considero este hilo acabado, me buscaré la vida como bien quieren, pero por favor tengan en cuenta todo lo que acabo de mencionar.
Saludos.
  #8 (permalink)  
Antiguo 24/12/2012, 08:16
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Respuesto tu opinión, y te agradezco que la hayas compartido.

Y lamento si mi respuesta te pareció poco agradable. De verdad, no era mi intención. Lo que pasa solamente es que opinamos diferente en cuanto a cómo debería funcionar un foro, y cómo debería ofrecerse la ayuda.

Si deseas que te ayude, muestra lo que has intentado con el JOIN o en qué parte no logras avanzar, con gusto trataré de orientarte. Si no, como dije, lamento no haber podido ayudarte.

Saludos.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 24/12/2012, 09:03
Avatar de javiertroya  
Fecha de Ingreso: mayo-2009
Ubicación: Valencia
Mensajes: 15
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Eliminar valores de un array / Listar array / MySQL

Hola que tal? Espero sigas leyendo, hace un tiempo tuve una aplicación parecida a la que dices y creo que tengo un código hecho, pero recuerdo haber usado algo distinto a un join ya que al igual que tu tabla, eran tres filas id_user, id_friend, frieandship_status.

Y mi consulta era la siguiente:

Código MySQL:
Ver original
  1. FROM  `friendship`
  2. WHERE id_user =1
  3. OR id_friend =1
  4. AND friendship_status =1

Sé que es muy simple pero, así como simple muy efectiva para lo que necesitaba ya que, si el usuario solicita la amistad el estaara en la columna id_user y si el es el que la acepta, estara en la columna id_friend siempre será así y cualquier otra cosa que necesites validar, la haces con esa misma consulta o con php. Como por ejemplo si el usuario visita el perfil otro digamos usuario 1 visita el perfil del 2 y quieres verificar si son amigos puedes hacer estas consulta:

Código MySQL:
Ver original
  1. #Primero si el 1 hizo la solicitud
  2. FROM  `friendship`
  3. WHERE id_user =1
  4. AND id_friend =2
  5. AND friendship_status = 1
  6.  
  7. #Luego si el 2 hizo la solicitud
  8. FROM  `friendship`
  9. WHERE id_user =2
  10. AND id_friend =1
  11. AND friendship_status = 1
  12.  
  13. # Verificar si la solicitud esta pendiente simplemente sustituye el 1 por 0 o el número que le asignes a pendiente, por ejemplo
  14.  
  15. FROM  `friendship`
  16. WHERE id_user =2
  17. AND id_friend =1
  18. AND friendship_status = 0

Espero te haya servido de mucha ayuda. debo destacar que el campo friendship_status para mi era un TINYINT.

Saludos!
  #10 (permalink)  
Antiguo 24/12/2012, 09:46
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Respuesta: Eliminar valores de un array / Listar array / MySQL

Disculpadme por el post anterior, estaba algo alterado por otras cosas y he soltado mi enfado en el post.
De verdad que no quiero faltarle el respeto a nadie ni criticar su opinión o forma de ver las cosas.

Continuemos con el problema.
He estado buscando alternativa con JOIN pero no encuentro cómo hacerlo exactamente.
Voy a dar más detalles de mi tabla y postear el código que uso actualmente.

Tabla amistades (estructura y ejemplos):
Código:
id_usuario_origen | id_usuario_destino | estado
    4r33e4er             9o2w56wd         aceptado
    9o2w56wd             2w0p98kw         pendiente
    9o2w56wd             6tt5x2h9         aceptado
En id_usuario_origen va el id de la persona que ha enviado la petición de amistad.
En id_usuario_destino va el id de la persona que a la que iba dirigida la petición de amistad.
En estado va el estado de la petición de amistad; es decir si ha sido aceptada, rechazada o todavía está pendiente de aceptar o no por el usuario al que iba dirigida (en id_usuario_destino).

Tabla usuarios (estructura simplificada y ejemplos):

Código:
id_usuario | nombre_usuario
 4r33e4er       Pepito
 9o2w56wd       Adrian
 2w0p98kw       Fulanito
 6tt5x2h9       Marta
Ahora imaginemos que yo soy Adrian, con id 9o2w56wd y quiero ver mi lista de todos mis amigos.
Pues este es el código que uso actualmente para hacer eso:
Código PHP:
<?php

require("data.php");
$id_usuario '9o2w56wd';
$conexion mysqli_connect("$servidormysql","$usuariomysql","$passmysql","$basededatos");

$consulta_amigos     mysqli_query($conexion,"SELECT * FROM amistades  WHERE id_usuario_origen = '".mysqli_real_escape_string($conexion,$id_usuario)."' AND estado = 'aceptado'");
$consulta_amigos2     mysqli_query($conexion,"SELECT * FROM amistades  WHERE id_usuario_destino = '".mysqli_real_escape_string($conexion,$id_usuario)."' AND estado = 'aceptado'");
$column = array();
while(
$array_amigos mysqli_fetch_array($consulta_amigos2)) {
    
$column[] = $array_amigos[1];
}
$column2 = array();
while(
$array_amigos mysqli_fetch_array($consulta_amigos)) {
    
$column2[] = $array_amigos[2];
}
$lista_de_amigos array_merge($column$column2);
sort($lista_de_amigos);
foreach (
$lista_de_amigos as $listar_amigos) { 
    
$nombre_amigo mysqli_fetch_array(mysqli_query($conexion,"SELECT nombre_usuario FROM usuarios WHERE id_usuario = '".mysqli_real_escape_string($conexion,$listar_amigos)."'"));
    echo 
$nombre_amigo['nombre_usuario'].'<br>';
}

?>
Esto me mostraría la siguiente lista de acuerdo con los datos que he puesto de ejemplo en la tabla amistades:
Código:
Marta
Pepito
Inicié este post para encontrar una forma de hacer lo mismo de manera sencilla y con el menor número de consultas posible, para que sea más rápido.
Como se puede ver en el código estoy haciendo dos consultas, una para cada columna y luego tantas consultas como amigos tenga el usuario en el bucle foreach para obtener el nombre del usuario de la tabla usuarios apartir de los ids del array $lista_de_amigos.
Llevo bastante tiempo buscando la mejor solución, y no se me ocurre. Seguro que es una tontería.
Lo único que se me ha ocurrido es solucionar lo de las consultas en el bucle foreach haciendo un explode en el array $lista_de_amigos y usando IN en la consulta SQL pero no sé si tendrá algún tipo de límite la consulta o si es la mejor solución.
Espero que me puedan ayudar, gracias.

Última edición por Adrii952; 24/12/2012 a las 09:53
  #11 (permalink)  
Antiguo 24/12/2012, 10:53
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Si has entendido cómo funciona el JOIN, entenderás qué significa esto:
Código MySQL:
Ver original
  1.     IF(id_usuario_origen = $id_usuario, u1.nombre_usuario, u2.nombre_usuario) AS nombre_usuario
  2.     amistades
  3. JOIN usuarios u1 ON id_usuario_origen = u1.id_usuario
  4. JOIN usuarios u2 ON id_usuario_destino = u2.id_usuario
  5.     (
  6.         id_usuario_origen = $id_usuario
  7.         XOR id_usuario_destino = $id_usuario
  8.     )
  9.     AND estado = 'aceptado'
Será algo así lo que necesitas.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #12 (permalink)  
Antiguo 24/12/2012, 13:23
Avatar de Adrii952  
Fecha de Ingreso: diciembre-2011
Ubicación: Madrid
Mensajes: 116
Antigüedad: 8 años, 1 mes
Puntos: 7
Respuesta: Eliminar valores de un array / Listar array / MySQL

Genial! Lo he adaptado y me ha servido!
Llevaba bastante tiempo buscando esto. Muchas gracias!
Felices fiestas!
  #13 (permalink)  
Antiguo 08/01/2013, 15:00
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 5 meses
Puntos: 397
Respuesta: Eliminar valores de un array / Listar array / MySQL

Cita:
Iniciado por David Ver Mensaje
Si has entendido cómo funciona el JOIN, entenderás qué significa esto:
Código MySQL:
Ver original
  1.     IF(id_usuario_origen = $id_usuario, u1.nombre_usuario, u2.nombre_usuario) AS nombre_usuario
  2.     amistades
  3. JOIN usuarios u1 ON id_usuario_origen = u1.id_usuario
  4. JOIN usuarios u2 ON id_usuario_destino = u2.id_usuario
  5.     (
  6.         id_usuario_origen = $id_usuario
  7.         XOR id_usuario_destino = $id_usuario
  8.     )
  9.     AND estado = 'aceptado'
Será algo así lo que necesitas.
@David, hay alguna manera de que esa consulta me retorne todos los valores de esa tabla, o tengo que hacer dos consultas a parte

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #14 (permalink)  
Antiguo 08/01/2013, 16:34
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Solo necesitarías quitar las condiciones del WHERE y usar u1 para seleccionar los campos que necesitas del primer usuario y u2 para los del segundo.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #15 (permalink)  
Antiguo 08/01/2013, 16:41
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 5 meses
Puntos: 397
Respuesta: Eliminar valores de un array / Listar array / MySQL

y en el bucle verifico que el id del usuario no corresponda con el de la session actual y de esa manera mostrar solo los amigos de ese usuario...

Gracias

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #16 (permalink)  
Antiguo 08/01/2013, 16:43
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Pero si solo vas a mostrar los amigos del usuario que ha iniciado sesión te conviene filtrarlo ya directamente en la consulta, ¿o necesitas también los demás registros?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #17 (permalink)  
Antiguo 08/01/2013, 16:49
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 5 meses
Puntos: 397
Respuesta: Eliminar valores de un array / Listar array / MySQL

Si necesito acceder a varios de los datos de los amigos de ese usuario, si solo necesitara listar el nombre el ejemplo que habias dejado era perfecto, pero como if y case solo permiten retornar un valor especifico, preguntaba si habia otra manera de traer todos los datos de los usuarios, excluyendo los datos del usuario que inicio session, aunque no se si sea lo mas correcto

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #18 (permalink)  
Antiguo 08/01/2013, 17:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.712
Antigüedad: 14 años, 10 meses
Puntos: 836
Respuesta: Eliminar valores de un array / Listar array / MySQL

Podrías hacerlo así:
Código MySQL:
Ver original
  1.     IF(id_usuario_origen = $id_usuario, u1.nombre_usuario, u2.nombre_usuario) AS nombre_usuario,
  2.     IF(id_usuario_origen = $id_usuario, u1.otro_campo, u2.otro_campo) AS campo_usuario
  3.     ...
  4.     amistades
  5. JOIN usuarios u1 ON id_usuario_origen = u1.id_usuario
  6. JOIN usuarios u2 ON id_usuario_destino = u2.id_usuario
  7.     (
  8.         id_usuario_origen = $id_usuario
  9.         XOR id_usuario_destino = $id_usuario
  10.     )
  11.     AND estado = 'aceptado'
Seguirá siendo mucho mejor que traer todos los datos de la tabla cuando solo usarás una pequeña parte.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 08/01/2013 a las 18:49
  #19 (permalink)  
Antiguo 08/01/2013, 17:08
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 8 años, 5 meses
Puntos: 397
Respuesta: Eliminar valores de un array / Listar array / MySQL

Ok gracias lo tendre en cuenta

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.

Etiquetas: mysql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:55.