2 votos

Utilizar función en una consulta SQL

Que tal, resulta que tengo una tabla donde solo registra el id del usuario, mas no la sede a la cual pertenece, ya que eso esta en la tabla de usuarios por ejemplo

Tabla Usuarios id:1 name:Raul id_sede:5

id:2 name:Roberto id_sede:3

Tabla Propiedad id:1 type:Departamento id_user:1

Lo que yo quiero hacer es mostrar las propiedades de los usuarios que pertenezcan a la sede con id 5 por lo cual cree esta función para obtener el id de cada usuario:

function getsedeuser($id){
$query_GetUserSede = sprintf ("SELECT id_sede FROM users WHERE users.id = %s", GetSQLValueString($id, "int"));
$GetUserSede = mysql_query($query_GetUserSede, conect::dbconect()) or die(mysql_error());
$row_GetUserSede = mysql_fetch_assoc($GetUserSede);
$totalRows_GetUserSede = mysql_num_rows($GetUserSede);
return $row_GetUserSede ["id_sede"];
mysql_free_result($GetUserSede);
}

Y por lo cual la implemente en la consulta:

$query_GetExpiredProperties = sprintf("SELECT id FROM properties WHERE getsedeuser(id_user)=%s",$_SESSION['MM_Sede'],"int");
$GetExpiredProperties = mysql_query($query_GetExpiredProperties, conect::dbconect()) or die(mysql_error());
$row_GetExpiredProperties = mysql_fetch_assoc($GetExpiredProperties);
$totalRows_GetExpiredProperties = mysql_num_rows($GetExpiredProperties);

De otra forma mas sencilla creo que podria hacer un JOIN, pero creo que gasta mas recursos ya que en muchas ocaciones cuando lo he echo me sobrecarga la web y nunca llega a cargar

2 votos

Un join por un campo numérico no debería sobrecargarte la web, si esto pasa prueba a poner un index en los campos que se vaya a hacer join.

1 votos

Si lo entendí bien, porque lo veo un poco complicado lo que explicas, quieres obtener los usuarios que pertenecen a una sede, teniendo la ID de la sede y una tabla "usuarios" con los siguientes campos: id, name, id_sede Independientemente de como hagas la conexión y demás... la consulta SQL: "SELECT * FROM usuarios WHERE id_sede={$sede_id}"; Si lo que tienes es el nombre de la sede, con lo que necesitas su id para obtener los usuarios: "SELECT * FROM usuarios WHERE id_sede=(SELECT id FROM sedes WHERE name='{$nombre_sede}')"; No lo compliques más. Un saludo.

2voto

ArtEze Puntos 285

Yo me imagino algo como esto (Me gustaría que este sitio soporte tablas, pero bueno, lo hago con código).

Tabla Usuarios

+---------+---------+------+
| Usuario |  Nombre | Sede |
+---------+---------+------+
|    1    |   Raúl  |   5  |
+---------+---------+------+
|    2    | Roberto |   3  |
+---------+---------+------+

Tabla Propiedades

+-----------+--------------+-------------+
| Propiedad |     Tipo     |   Usuario   |
+-----------+--------------+-------------+
|     1     | departamento |   1 (Raúl)  |
+-----------+--------------+-------------+
|     2     |     baño     | 2 (Roberto) |
+-----------+--------------+-------------+
|     1     |     casa     |   1 (Raúl)  |
+-----------+--------------+-------------+
|     2     |    cocina    | 2 (Roberto) |
+-----------+--------------+-------------+

Se intenta obtener: propiedades( sede(5) ), no tengo idea cómo hacer eso, pero respondo algunas observaciones.

Habría que cambiar todo el código de mysql por mysqli.

  • mysql_fetch_assoc por mysqli_fetch_assoc.
  • mysql_query por mysqli_query.
  • conect::dbconect por db2_connect.
  • mysql_error por mysqli_error.
  • mysql_num_rows por mysqli_num_rows.
  • mysql_free_result por mysqli_free_result.

Creo que poner un return antes del final no está bien, la segunda línea no se va a ejecutar nunca.

return $row_GetUserSede ["id_sede"];
mysqli_free_result($GetUserSede); //mysql_free_result cambiado por mysqli_free_result.

Yo lo pondría así.

mysqli_free_result($GetUserSede);
return $row_GetUserSede ["id_sede"];

La siguiente variable se está declarando pero no se usa en getSedeUser, a no ser que sea una variable global, pero tampoco se está usando en la consulta implementada, por lo que creo que no es necesario.

$totalRows_GetUserSede = mysql_num_rows($GetUserSede);

1 votos

Es poco probable que iteramos tenga tablas... utiliza Markdown como editor, y no lo soporta =( te dejo un hilo de Stack donde se habla del tema http://meta.stackexchange.com/questions/73566/is-there-any-markdown-to-create-tables y aquí tienes una web que te permite generar tablas mediante barras y tal http://www.tablesgenerator.com/markdown_tables

0 votos

Jeje, sabía era que tenía 4 notificaciones, pero por el error 500, tuve que buscar, y encontré esta respuesta. Pude ver que la vista previa no es igual que la respuesta publicada, transforma todos los tag HTML que no aparecen en la vista previa a texto plano donde aparece en la respuesta publicada, se podría hacer un post-procesado para que soporte tablas.

1voto

ArtEze Puntos 285

Bueno, busqué a ver qué era Join, y es mucho mejor, en 2 líneas lo resuelve.

https://es.wikipedia.org/wiki/Join#Natural_.28Natural_join.29

Esto se llama "Unión natural", hace una unión con las columnas que tienen el mismo nombre en dos tablas diferentes.

SELECT *
FROM Usuarios NATURAL JOIN Propiedades

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X