epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Hola a todos... tengo 2 tablas en la bd , ambas relacionadas por el rut.:

1.- pacientes
2.- seguimiento

En la tabla "pacientes" tengo 1 registro con el Rut "11111111-1" y en la tabla "seguimiento" tengo 2 registros con el mismo Rut "11111111-1" (ya que un paciente puede tener mas de un seguimiento) y si hago la consulta:

SELECT * FROM pacientes, seguimiento WHERE pacientes.rut=seguimiento.rut

Me trae datos duplicados del paciente "11111111-1" ya que esta 2 veces en la tabla "seguimiento", lo que quiero hacer es que me lo traiga solo una vez.


En PHP tengo:
$sql2 = "SELECT * FROM pacientes, seguimiento WHERE pacientes.rut=seguimiento.rut";
$resultado2 = $mysqli->query($sql2) or trigger_error($mysqli->error);

y mas abajo una tabla:
<div class="row table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Rut</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Email</th>
<th>Telefono</th>
<th>Tipo Diabetes</th>
<th>Fecha Ingreso</th>
<th>Fecha Educación</th>
<th></th>
<th></th>
</tr>
</thead>

<tbody>
<?php while($row2= $resultado2->fetch_array(MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $row2['rut']; ?></td>
<td><?php echo $row2['nombres']; ?></td>
<td><?php echo $row2['apellidos']; ?></td>
<td><?php echo $row2['email1']; ?></td>
<td><?php echo $row2['telefono1']; ?></td>
<td><?php echo $row2['tipo_diabetes']; ?></td>
<td><?php echo $row2['f_ing_prog']; ?></td>
<td><?php echo $row2['f_educacion']; ?></td>
<td><a href="modificar.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-pencil" title="Editar Registro"></span></a></td>
<td><a href="seguimiento.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-plus" title="Agregar Seguimiento"></span></a></td>
<td><a href="#" data-href="eliminar.php?rut=<?php echo $row2['rut']; ?>" data-toggle="modal" data-target="#confirm-delete" title="Eliminar Registro"><span class="glyphicon glyphicon-trash"></span></a></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>



El Campo "Fecha Educación (f_educacion)" pertenece a la tabla "seguimiento", y todos los demas a la table "pacientes" de la bd.


Si me puede echar una manito... gracias!
 

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Está peludo agregar f_educacion ahí sin mandar el costo de la consulta a la cresta. La manera elegante es llamar solamente una vez a la tabla seguimiento utilizando funciones tipo dense_rank pero también está el método bruto que es llamarla dos veces o incluso hacer una subquery.


Código:
SELECT p.rut, p.nombres, p.apellidos, p.email1, p.telefono1, p.tipo_diabetes, p.f_ing_prog,
       MAX(s.f_educacion) KEEP(DENSE_RANK LAST ORDER BY s.id_seguimiento)
FROM pacientes p
left join seguimiento s where s.rut = p.rut
group by p.rut, p.nombres, p.apellidos, p.email1, p.telefono1, p.tipo_diabetes, p.f_ing_prog

Update, me habían faltado los group by

Ojo

Dado que para un rut puede haber más de un f_educacion distinto, estoy asumiendo que el último f_educacion es el que vale.




Cáchate esto


Notice: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(DENSE_RANK LAST ORDER BY s.id_seguimiento) FROM pacientes p left join segu...' at line 2 in /opt/lampp/htdocs/prueba/todo.php on line 27


Si, esa fecha ahí me esta jodiendo todo sin que me joda el botón buscar de arriba.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Notice: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(DENSE_RANK LAST ORDER BY s.id_seguimiento) FROM pacientes p left join segu...' at line 2 in /opt/lampp/htdocs/prueba/todo.php on line 27

Prueba de nuevo porque me faltaron los campos del group by
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Mi consejo es que hagas 2 querys, una para la lista general, y otra para consultar por rut. Esto por seguridad dado que puedes usar prepared statements cuando haya inputs del usuario para que no te metan codigo sucio en vez de rut.

:lezippy

Usé pacientes.* pq me dio paja escribir los campos que usas, pero tu si deberias hacerlo.
PHP:
$valor = $_POST['rut'];
$stmt = $conexion->prepare("
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
INNER JOIN seguimiento
ON pacientes.rut=seguimiento.rut
WHERE pacientes.rut = ?
");
//puedes hacer LIMIT 1 si lo deseas.
//el signo de interrogacino significa que mas adelante le vas a dar el valor.
//aca le estas diciendo que vas a pasar un string al query sql, especificamente donde esta el signo de interogacion. No estoy seguro si lo puedes pasar como int.
    $stmt->bind_param("s", $valor);
    $stmt->execute();
    $result = $stmt->get_result();
//si encuentra alguna tabla, muestra un array.
    if (mysqli_num_rows($result) > 0) {
        $row = $result->fetch_all(MYSQLI_ASSOC);
        print_r($row);
//el resto de tu codigo para las tablas va aqui.
    } else {
        die("error");
//muestra algun error si no hace return de alguna tabla
    }
 
Última modificación:
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Ademas deberias sanitizar el input de rut.
Código:
$valor = $_POST['rut'];
por
Código:
$valor = filter_var($_POST['rut'], FILTER_SANITIZE_NUMBER_INT);
Para que no metan un string de codigo en tu campo. Ademas intenta acostumbrarte a usar prepared statements de ahora en adelante.
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Prueba de nuevo porque me faltaron los campos del group by

Lo probé otra vez, pero me arroja error también

$sql = "SELECT p.rut, p.nombres, p.apellidos, p.email1, p.telefono1, p.tipo_diabetes, p.f_ing_prog, MAX(s.f_educacion) KEEP(DENSE_RANK LAST ORDER BY s.id_seguimiento) FROM pacientes p left join seguimiento s where s.rut = p.rut group by p.rut, p.nombres, p.apellidos, p.email1, p.telefono1, p.tipo_diabetes, p.f_ing_prog";
$resultado = $mysqli->query($sql) or trigger_error($mysqli->error);


Notice: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '(DENSE_RANK LAST ORDER BY s.id_seguimiento) FROM pacientes p left join seguim...' at line 1 in /opt/lampp/htdocs/prueba/todo.php on line 23


Fatal error
: Uncaught Error: Call to a member function fetch_array() on bool in /opt/lampp/htdocs/prueba/todo.php:75 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/prueba/todo.php on line 75

<tbody>
#esta es la linea 75 <?php while($row2= $resultado->fetch_array(MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $row2['rut']; ?></td>
<td><?php echo $row2['nombres']; ?></td>
<td><?php echo $row2['apellidos']; ?></td>
<td><?php echo $row2['email1']; ?></td>
<td><?php echo $row2['telefono1']; ?></td>
<td><?php echo $row2['tipo_diabetes']; ?></td>
<td><?php echo $row2['f_ing_prog']; ?></td>
<td><?php echo $row2['f_educacion']; ?></td>
<td><a href="modificar.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-pencil" title="Editar Registro"></span></a></td>
<td><a href="seguimiento.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-plus" title="Agregar Seguimiento"></span></a></td>
<td><a href="#" data-href="eliminar.php?rut=<?php echo $row2['rut']; ?>" data-toggle="modal" data-target="#confirm-delete" title="Eliminar Registro"><span class="glyphicon glyphicon-trash"></span></a></td>
</tr>
<?php } ?>
</tbody>
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846

Mi consejo es que hagas 2 querys, una para la lista general, y otra para consultar por rut. Esto por seguridad dado que puedes usar prepared statements cuando haya inputs del usuario para que no te metan codigo sucio en vez de rut.

:lezippy

Usé pacientes.* pq me dio paja escribir los campos que usas, pero tu si deberias hacerlo.
PHP:
$valor = $_POST['rut'];
$stmt = $conexion->prepare("
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
INNER JOIN seguimiento
ON pacientes.rut=seguimiento.rut
WHERE pacientes.rut = ?
");
//el signo de interrogacino significa que mas adelante le vas a dar el valor.
//aca le estas diciendo que vas a pasar un string al query sql, especificamente donde esta el signo de interogacion. No estoy seguro si lo puedes pasar como int.
    $stmt->bind_param("s", $valor);
    $stmt->execute();
    $result = $stmt->get_result();
//si encuentra alguna tabla, muestra un array.
    if (mysqli_num_rows($result) > 0) {
        $row = $result->fetch_all(MYSQLI_ASSOC);
        print_r($row);
//el resto de tu codigo para las tablas va aqui.
    } else {
        die("error");
//muestra algun error si no hace return de alguna tabla
    }


Pero dentro del codigo como deberia ir ? ya que mas abajo deben aparecen en la tabla:



<?php
require 'conexion.php';
$user = $_SESSION['nombredelusuario'];
$campo= "";
if(!empty($_POST))
{
$valor = $_POST['rut'];
if(!empty($valor)){
$campo= "AND rut LIKE '%$valor'";
}
}
$sql = "SELECT * FROM pacientes where pacientes.rut in (select seguimiento.rut from seguimiento) $campo";
$resultado = $mysqli->query($sql) or trigger_error($mysqli->error);
?>
<html lang="es">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/bootstrap-theme.css" rel="stylesheet">
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</head>

<body>

<div class="container">
<div class="row">
<h2 style="text-align:center">FORMULARIO</h2>
</div>

<div class="row">
<a href="nuevo.php" class="btn btn-primary">Nuevo Registro</a>

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<b>Rut: </b><input type="text" id="rut" name="rut" />
<input type="submit" id="enviar" name="enviar" value="Buscar" class="btn btn-info" />
<a href="salir.php" class="btn btn-primary">Logout</a>
</form>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<a href="excel.php" class="btn btn-info">Descargar Excel</a>
</form>
</div>

<br>

<div class="row table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Rut</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Email</th>
<th>Telefono</th>
<th>Tipo Diabetes</th>
<th>Fecha Ingreso</th>
<th>Fecha Educación</th>
<th></th>
<th></th>
</tr>
</thead>

<tbody>
<?php while($row2= $resultado->fetch_array(MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $row2['rut']; ?></td>
<td><?php echo $row2['nombres']; ?></td>
<td><?php echo $row2['apellidos']; ?></td>
<td><?php echo $row2['email1']; ?></td>
<td><?php echo $row2['telefono1']; ?></td>
<td><?php echo $row2['tipo_diabetes']; ?></td>
<td><?php echo $row2['f_ing_prog']; ?></td>
<td><?php echo $row2['f_educacion']; ?></td>
<td><a href="modificar.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-pencil" title="Editar Registro"></span></a></td>
<td><a href="seguimiento.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-plus" title="Agregar Seguimiento"></span></a></td>
<td><a href="#" data-href="eliminar.php?rut=<?php echo $row2['rut']; ?>" data-toggle="modal" data-target="#confirm-delete" title="Eliminar Registro"><span class="glyphicon glyphicon-trash"></span></a></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>

<!-- Modal -->
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Eliminar Registro</h4>
</div>

<div class="modal-body">
¿Desea eliminar este registro?
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<a class="btn btn-danger btn-ok">Delete</a>
</div>
</div>
</div>
</div>

<script>
$('#confirm-delete').on('show.bs.modal', function(e) {
$(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));

$('.debug-url').html('Delete URL: <strong>' + $(this).find('.btn-ok').attr('href') + '</strong>');
});
</script>

</body>
</html>

ese codigo me hace todo excepto que no me trae la fecha de educacion que es de la otra tabla de la bd

1652732006761.png
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
No lo he probado aun pq no tengo la base de datos, pero a ver que tal. Deberia desaparecer el error del f_seguimiento, ademas solo mostrar 1 resultado por rut.
PHP:
<?php
require 'conexion.php';
$user = $_SESSION['nombredelusuario'];
$campo= "";
if(!empty($_POST))
{
$valor = $_POST['rut'];
if(!empty($valor)){
$campo= "WHERE pacientes.rut LIKE '%$valor'";
}
}
$sql = "SELECT DISTINCT(pacientes.rut), pacientes.*, seguimiento.f_educacion FROM pacientes
INNER JOIN seguimiento
ON paciente.rut = seguimiento.rut
$campo
GROUP BY pacientes.rut ";
$resultado = $mysqli->query($sql) or trigger_error($mysqli->error);
?>
<html lang="es">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/bootstrap-theme.css" rel="stylesheet">
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</head>

<body>

<div class="container">
<div class="row">
<h2 style="text-align:center">FORMULARIO</h2>
</div>

<div class="row">
<a href="nuevo.php" class="btn btn-primary">Nuevo Registro</a>

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<b>Rut: </b><input type="text" id="rut" name="rut" />
<input type="submit" id="enviar" name="enviar" value="Buscar" class="btn btn-info" />
<a href="salir.php" class="btn btn-primary">Logout</a>
</form>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<a href="excel.php" class="btn btn-info">Descargar Excel</a>
</form>
</div>

<br>

<div class="row table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Rut</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Email</th>
<th>Telefono</th>
<th>Tipo Diabetes</th>
<th>Fecha Ingreso</th>
<th>Fecha Educación</th>
<th></th>
<th></th>
</tr>
</thead>

<tbody>
<?php while($row2= $resultado->fetch_array(MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $row2['rut']; ?></td>
<td><?php echo $row2['nombres']; ?></td>
<td><?php echo $row2['apellidos']; ?></td>
<td><?php echo $row2['email1']; ?></td>
<td><?php echo $row2['telefono1']; ?></td>
<td><?php echo $row2['tipo_diabetes']; ?></td>
<td><?php echo $row2['f_ing_prog']; ?></td>
<td><?php echo $row2['f_educacion']; ?></td>
<td><a href="modificar.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-pencil" title="Editar Registro"></span></a></td>
<td><a href="seguimiento.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-plus" title="Agregar Seguimiento"></span></a></td>
<td><a href="#" data-href="eliminar.php?rut=<?php echo $row2['rut']; ?>" data-toggle="modal" data-target="#confirm-delete" title="Eliminar Registro"><span class="glyphicon glyphicon-trash"></span></a></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>

<!-- Modal -->
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Eliminar Registro</h4>
</div>

<div class="modal-body">
¿Desea eliminar este registro?
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<a class="btn btn-danger btn-ok">Delete</a>
</div>
</div>
</div>
</div>

<script>
$('#confirm-delete').on('show.bs.modal', function(e) {
$(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));

$('.debug-url').html('Delete URL: <strong>' + $(this).find('.btn-ok').attr('href') + '</strong>');
});
</script>

</body>
</html>
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
me
No lo he probado aun pq no tengo la base de datos, pero a ver que tal. Deberia desaparecer el error del f_seguimiento, ademas solo mostrar 1 resultado por rut.
PHP:
<?php
require 'conexion.php';
$user = $_SESSION['nombredelusuario'];
$campo= "";
if(!empty($_POST))
{
$valor = $_POST['rut'];
if(!empty($valor)){
$campo= "WHERE rut LIKE '%$valor'";
}
}
$sql = "SELECT DISTINCT(pacientes.rut), pacientes.*, seguimiento.f_educacion FROM pacientes
INNER JOIN seguimiento
ON paciente.rut = seguimiento.rut
$campo
GROUP BY pacientes.rut ";
$resultado = $mysqli->query($sql) or trigger_error($mysqli->error);
?>
<html lang="es">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/bootstrap-theme.css" rel="stylesheet">
<script src="js/jquery-3.1.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</head>

<body>

<div class="container">
<div class="row">
<h2 style="text-align:center">FORMULARIO</h2>
</div>

<div class="row">
<a href="nuevo.php" class="btn btn-primary">Nuevo Registro</a>

<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<b>Rut: </b><input type="text" id="rut" name="rut" />
<input type="submit" id="enviar" name="enviar" value="Buscar" class="btn btn-info" />
<a href="salir.php" class="btn btn-primary">Logout</a>
</form>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="POST">
<a href="excel.php" class="btn btn-info">Descargar Excel</a>
</form>
</div>

<br>

<div class="row table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>Rut</th>
<th>Nombres</th>
<th>Apellidos</th>
<th>Email</th>
<th>Telefono</th>
<th>Tipo Diabetes</th>
<th>Fecha Ingreso</th>
<th>Fecha Educación</th>
<th></th>
<th></th>
</tr>
</thead>

<tbody>
<?php while($row2= $resultado->fetch_array(MYSQLI_ASSOC)) { ?>
<tr>
<td><?php echo $row2['rut']; ?></td>
<td><?php echo $row2['nombres']; ?></td>
<td><?php echo $row2['apellidos']; ?></td>
<td><?php echo $row2['email1']; ?></td>
<td><?php echo $row2['telefono1']; ?></td>
<td><?php echo $row2['tipo_diabetes']; ?></td>
<td><?php echo $row2['f_ing_prog']; ?></td>
<td><?php echo $row2['f_educacion']; ?></td>
<td><a href="modificar.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-pencil" title="Editar Registro"></span></a></td>
<td><a href="seguimiento.php?rut=<?php echo $row2['rut']; ?>"><span class="glyphicon glyphicon-plus" title="Agregar Seguimiento"></span></a></td>
<td><a href="#" data-href="eliminar.php?rut=<?php echo $row2['rut']; ?>" data-toggle="modal" data-target="#confirm-delete" title="Eliminar Registro"><span class="glyphicon glyphicon-trash"></span></a></td>
</tr>
<?php } ?>
</tbody>
</table>
</div>
</div>

<!-- Modal -->
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">

<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Eliminar Registro</h4>
</div>

<div class="modal-body">
¿Desea eliminar este registro?
</div>

<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<a class="btn btn-danger btn-ok">Delete</a>
</div>
</div>
</div>
</div>

<script>
$('#confirm-delete').on('show.bs.modal', function(e) {
$(this).find('.btn-ok').attr('href', $(e.relatedTarget).data('href'));

$('.debug-url').html('Delete URL: <strong>' + $(this).find('.btn-ok').attr('href') + '</strong>');
});
</script>

</body>
</html>

Si reemplazo todo , me dice que el rut es ambiguo:
Notice: Column 'rut' in where clause is ambiguous in /opt/lampp/htdocs/prueba/todo.php on line 25

si solamente reemplazo el apartado me trae la fecha, pero me deja de funcionar el buscar.
<?php
require 'conexion.php';
$user = $_SESSION['nombredelusuario'];
$campo= "";
if(!empty($_POST))
{
$valor = $_POST['rut'];
if(!empty($valor)){
$campo= "WHERE rut LIKE '%$valor'";
}
}
$sql = "SELECT DISTINCT(pacientes.rut), pacientes.*, seguimiento.f_educacion FROM pacientes
INNER JOIN seguimiento
ON pacientes.rut = seguimiento.rut $campo";
$resultado = $mysqli->query($sql) or trigger_error($mysqli->error);
?>
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
Si pq hay dos columnas rut, debes especificar cual de los dos en el valor de la variable $Campo. Donde dice rut cambialo por pacientes.rut

Código:
$campo= "WHERE pacientes.rut LIKE '%$valor'";

Lo otro es que no estoy seguro que usar LIKE sea mejor que usar =
Código:
$campo= "WHERE pacientes.rut = '%$valor'";

Si despues tienes mas errores de ambiguedad, la solucion siempre es la misma, decirle cual te refieres.

Actualice el codigo
 
Última modificación:
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
s
Si pq hay dos columnas rut, debes especificar cual de los dos en el valor de la variable $Campo. Donde dice rut cambialo por pacientes.rut

Código:
$campo= "WHERE pacientes.rut LIKE '%$valor'";

Lo otro es que no estoy seguro que usar LIKE sea mejor que usar =
Código:
$campo= "WHERE pacientes.rut = '%$valor'";

Si despues tienes mas errores de ambiguedad, la solucion siempre es la misma, decirle cual te refieres.

Actualize el codigo

Si, ahi al parecer esta funcionando!...aunque me trae la primera fecha en vez de la ultima, pero por lo menos no se rompe nada al parecer
 
Upvote 0

ricm

Se incorporó
28 Agosto 2005
Mensajes
7.590
s


Si, ahi al parecer esta funcionando!...aunque me trae la primera fecha en vez de la ultima, pero por lo menos no se rompe nada al parecer
recuerda cambiar pacientes.* por lo que corresponde, yo no lo hice por paja pero debes hacerlo.
Tambien puedes tomar las fechas mas antiguas usando min() en tu sql
 
Upvote 0

Lordnet

Autoridad Ancestral de Transacciones
Se incorporó
11 Junio 2004
Mensajes
2.231
puedes meter unos tres registros de ejemplo (inventados) en fiddle para no tener que estar haciendo consultas en el aire?

asi vemos la consulta como debe quedar y luego la adsptación a PHP.
 
Upvote 0

el_dva

Capo
Se incorporó
23 Noviembre 2009
Mensajes
203
SQL:
SELECT *
FROM pacientes p
WHERE exists ( SELECT 1 FROM seguimiento s where s.rut = p-rut )

Estimado @Zuljin esa query es muy ineficiente debido a los "nested loop", no se recomienda por ningún motivo condicionar un campo a otro de la query en la subquery:

@epic, esta query debe funcionar trae la ultima fecha de seguimiento:

SQL:
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento ON paciente.rut = seguimiento.rut

en tu codigo queda asi :
PHP:
$sql = "SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento  ON paciente.rut = seguimiento.rut
$campo
";
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
Estimado @Zuljin esa query es muy ineficiente debido a los "nested loop", no se recomienda por ningún motivo condicionar un campo a otro de la query en la subquery:

@epic, esta query debe funcionar trae la ultima fecha de seguimiento:

SQL:
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento ON paciente.rut = seguimiento.rut

en tu codigo queda asi :
PHP:
$sql = "SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento  ON paciente.rut = seguimiento.rut
$campo
";

El operador exist tiene un costo similar al campo IN, ojo ahí, y es súper eficiente (aunque no sirve para lo que buscaba @epic ).

Igual hay que asumir que @epic tiene los campos rut indexados.
 
Upvote 0

el_dva

Capo
Se incorporó
23 Noviembre 2009
Mensajes
203
El operador exist tiene un costo similar al campo IN, ojo ahí, y es súper eficiente (aunque no sirve para lo que buscaba @epic ).

Igual hay que asumir que @epic tiene los campos rut indexados.

El tema no es el operador EXISTS (que es mas flexible que IN), es en la condicional de la subquery
SQL:
SELECT 1 FROM seguimiento s where s.rut = p.rut
, donde por su condicional "where s.rut = p.rut" se debe ejecutar por cada tupla de pacientes por lo que esta alli la ineficiencia, puedes consultar mas en https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.872
El tema no es el operador EXISTS (que es mas flexible que IN), es en la condicional de la subquery
SQL:
SELECT 1 FROM seguimiento s where s.rut = p.rut
, donde por su condicional "where s.rut = p.rut" se debe ejecutar por cada tupla de pacientes por lo que esta alli la ineficiencia, puedes consultar mas en https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html.

Igual la propuesta del exist no sirve para lo que necesitaba epic así que no me voy a detener mucho por ahí y además desconozco las cantidades y cardinalidad de los datos, pero los índices justamente funcionan de esa manera.

No voy a hablar de lo que hace o no hace el optimizador de mysql, pero en Oracle el optimizador decide basado en las estadísticas que tabla utilizar como pivote.

Ahora bien, la ventaja del exists (y que es la razón de su existencia como operador), es que al contrario de un join clásico simplemente te basas únicamente en un único campo indexado para hacer los match cuando tu objetivo es únicamente asegurarse de que los valores de la tabla base existen en una tabla secundaria.De esa manera se recorre únicamente el índice y no otros campos, ahorrando el tener que buscar en la tabla secundaria.

Aún cuando la tabla principal sea gigantesca, si la cardinalidad es buena y la tabla secundaria es pequeña la consulta hace los match rápidamente.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
recuerda cambiar pacientes.* por lo que corresponde, yo no lo hice por paja pero debes hacerlo.
Tambien puedes tomar las fechas mas antiguas usando min() en tu sql
oka, ahi cambie el pacienets.* por los campos que necesito.
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Estimado @Zuljin esa query es muy ineficiente debido a los "nested loop", no se recomienda por ningún motivo condicionar un campo a otro de la query en la subquery:

@epic, esta query debe funcionar trae la ultima fecha de seguimiento:

SQL:
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento ON paciente.rut = seguimiento.rut

en tu codigo queda asi :
PHP:
$sql = "SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento  ON paciente.rut = seguimiento.rut
$campo
";
gracias @el_dva , funciona perfecto!
 
Upvote 0

epic

Pro
Se incorporó
11 Febrero 2007
Mensajes
846
Estimado @Zuljin esa query es muy ineficiente debido a los "nested loop", no se recomienda por ningún motivo condicionar un campo a otro de la query en la subquery:

@epic, esta query debe funcionar trae la ultima fecha de seguimiento:

SQL:
SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento ON paciente.rut = seguimiento.rut

en tu codigo queda asi :
PHP:
$sql = "SELECT pacientes.*, seguimiento.f_educacion
FROM pacientes
JOIN (
    SELECT rut, MAX(f_educacion) AS f_educacion
    FROM seguimiento
    GROUP BY rut
    ) AS seguimiento  ON paciente.rut = seguimiento.rut
$campo
";

Hola otra vez @el_dva ... queria editar esa consulta para agregar otro JOIN con otro SELECT y consultar otra tabla:

PHP:
<?php
    require 'conexion.php';
    $campo= "";
    if(!empty($_POST))
    {
    $valor = $_POST['rut'];
    if(!empty($valor)){
    $campo= "WHERE pacientes.rut LIKE '%$valor'";
    }
}
$sql = "SELECT pacientes.rut, pacientes.nombres, pacientes.apellidos, pacientes.email1, pacientes.telefono1, pacientes.tipo_diabetes, pacientes.f_ing_prog, educacion.f_educacion, seguimiento.num_seguimiento, seguimiento.alta_center
        FROM pacientes
        JOIN (SELECT rut, MAX(f_educacion) AS f_educacion FROM educacion GROUP BY rut) AS educacion ON pacientes.rut = educacion.rut
        JOIN (SELECT rut, MAX(num_seguimiento) AS num_seguimiento, alta_center FROM seguimiento GROUP BY rut) AS seguimiento ON pacientes.rut = seguimiento.rut
        $campo";
    $resultado = $mysqli->query($sql) or trigger_error($mysqli->error);
?>

El Primer JOIN que pusiste lo cambie un poco ya que cambio el nombre de esa tabla a "educación" y se creo otra con el nombre "seguimiento" (la "seguimiento" anterior ahora se llama "educación" y el actual seguimiento tiene otros campos).

Agregue la linea:

PHP:
JOIN (SELECT rut, MAX(num_seguimiento) AS num_seguimiento, alta_center FROM seguimiento GROUP BY rut) AS seguimiento ON pacientes.rut = seguimiento.rut

y funciona bien hasta cierto punto... como el "seguimiento" se agrega después que el paciente, al principio esa tabla (seguimiento) esta vacía y por lo tanto no hay un "Rut" y la vinculación entre ambas tablas no funciona (pacientes.rut = seguimiento.rut), por lo tanto cuando se hace la consulta no me muestra nada a no ser que le meta a mano en la BD un seguimiento al paciente... si hago eso me muestra todos los campos (rut, nombre, apellidos, mail, telefono, etc), inclusive los de seguimiento.


:S
 
Última modificación:
Upvote 0
Subir