26/02/2013, 03:42
|
| | | Fecha de Ingreso: septiembre-2012 Ubicación: Jaén (Andalucía)
Mensajes: 893
Antigüedad: 12 años, 4 meses Puntos: 10 | |
Respuesta: Listar resultados de tres consultas. Cita:
Iniciado por gnzsoloyo Una columna es ambigua cuando en un JOIN se invoca a una columna que aparece en dos tablas al mismo tiempo con ese nombre.
Normalmente, desde la optica de las bases de datos, implica que hay una definición de nombres de tablas incorrecto (las buenas practicas dicen que dos tablas diferentes no deben llevar nombres de campos iguales jamás, por lo que suele anteponerse un prefijo a los mismos).
En tu caso es un defecto producto de suprimir los alias en algunos casos en el WHERE.
Si tomamos de base tu consulta original, podemos reconstruir cómo debe ser ese script, pero con algunos ajustes.
Probemos:
Código PHP:
Ver original<?php include("Connections/conexion.php"); if ($_GET["action"] == "listar") { // valores recibidos por POST $vte = $_POST['telefonos']; $ape = $_POST['apellidos']; $name = $_POST['name']; $dni = $_POST['dni']; $calle = $_POST['calle']; $movil = $_POST['movil']; $loca = $_POST['localidad']; $condicion = ""; $orden = ""; // Condicion if (!empty($vte)) {$condicion = "A.telefonos='$vte')";} {$condicion = "A.movil = '$movil'";} else {$condicion .= "AND A.movil = '$movil'";} {$condicion = "calle A.dni = '$dni'";} else {$condicion .= "AND A.dni = '$dni'";} {$condicion = "B.calle like '%$calle%'";} else {$condicion .= "AND B.calle LIKE '%$calle%'";} {$condicion = " A.apellidos LIKE '%$ape%'";} else {$condicion .= "AND A.apellidos LIKE '%$ape%'";} {$condicion = "A.`name` LIKE '%$name%'";} else {$condicion .= "AND A.`name` LIKE '%$name%'";} {$condicion = "B.localidad LIKE '%$loca%'";} else {$condicion .= "AND B.localidad LIKE '%$loca%'";} if(empty ($condicion)) {$condicion = " 1 ";} // Ordenar por $vorder = $_POST['orderby']; if ($vorder != '') { $orden= " ORDER BY " . $vorder; } $sql = "SELECT "; $sql .= " 0 qnum, "; $sql .= " A.id_aviso, "; $sql .= " A.telefonos, "; $sql .= " A.telefonos3, "; $sql .= " A.movil, "; $sql .= " A.dni, "; $sql .= " A.`name`, "; $sql .= " A.apellidos, "; $sql .= " B.localidad, "; $sql .= " B.calle "; $sql .= "FROM "; $sql .= " clientes A INNER JOIN dir_clientes B ON A.id_aviso=B.id_aviso "; $sql .= "WHERE "; $sql .= " B.calle != '' AND $condicion "; $sql .= "UNION ALL "; $sql .= "SELECT "; $sql .= " 1 qnum, "; $sql .= " id_aviso, "; $sql .= " telefonos, "; $sql .= " telefonos3, "; $sql .= " movil, "; $sql .= " dni, "; $sql .= " `name`, "; $sql .= " apellidos, "; $sql .= " localidad, "; $sql .= " calle "; $sql .= "FROM "; $sql .= " avisos "; $sql .= "WHERE "; $sql .= " $condicion "; $sql .= "UNION ALL "; $sql .= "SELECT "; $sql .= " 2 qnum, "; $sql .= " A.id_aviso, "; $sql .= " A.telefonos, "; $sql .= " A.telefonos3, "; $sql .= " A.movil, "; $sql .= " A.dni, "; $sql .= " A.`name`, "; $sql .= " A.apellidos, "; $sql .= " B.localidad, "; $sql .= " B.calle "; $sql .= "FROM "; $sql .= " usuarios A INNER JOIN dir_usuarios B ON A.id_aviso=B.id_aviso "; $sql .= "WHERE "; $sql .= " B.calle != '' "; $sql .= " AND $condicion "; $sql .= "$orden"; // Verificamos la consulta echo $sql; // Ejecutando consulta if (!$sql) { } 'id_aviso' => $row['id_aviso'], 'telefonos' => $row['telefonos'], ); } // convertimos el array de datos a formato json /* Tienes resultados. */ } } ?>
Gonzalo, gracias pero este código no funciona nada y creo que es porque las condiciones que pones duplicas los AND en los if y tambien en los sql, no?
De todas formas te pongo el código completo actual que funciona bien salvo la búsqueda por calle. La base de datos funciona bien porque sino el código de el principio del post de muchos sqls tampoco funcionaría. Código PHP: <?php include("Connections/conexion.php"); if ($_GET["action"] == "listar") { // valores recibidos por POST $vte = $_POST['telefonos']; $ape = $_POST['apellidos']; $name = $_POST['name']; $dni = $_POST['dni']; $calle = $_POST['calle']; $movil = $_POST['movil']; $loca = $_POST['localidad']; $condicion = ""; $orden = ""; // crear parametros $condicion = ""; if ( ! empty($vte)) { $condicion = "telefonos='$vte'"; } if ( ! empty($movil)) { $condicion = "movil = '$movil'"; } if ( ! empty($dni)) { $condicion = "dni = '$dni'"; } if ( ! empty($name)) { $condicion = "name LIKE '%$name%'"; } if ( ! empty($ape)) { $condicion = "apellidos LIKE '%$ape%'"; } if ( ! empty($calle)) { $condicion = "calle LIKE '%$calle%'"; } if ( ! empty($loca)) { $condicion = "localidad LIKE '%$loca%'"; } // Ordenar por $vorder = $_POST['orderby']; if ($vorder != '') { $orden= " ORDER BY " . $vorder; } $sql = "SELECT 0 qnum, A.id_aviso, A.telefonos, A.telefonos3, A.movil, A.dni, A.name, A.apellidos, B.localidad, B.calle FROM clientes A INNER JOIN dir_clientes B ON A.id_aviso=B.id_aviso WHERE B.calle != '' AND $condicion UNION ALL SELECT 1 qnum, id_aviso, telefonos, telefonos3, movil, dni, name, apellidos, localidad, calle FROM avisos WHERE $condicion UNION ALL SELECT 2 qnum, U.id_aviso, U.telefonos, U.telefonos3, U.movil, U.dni, U.name, U.apellidos, D.localidad, D.calle FROM usuarios U INNER JOIN dir_usuarios D ON U.id_aviso=D.id_aviso WHERE D.calle != '' AND $condicion"; // Ejecutando consulta $query = mysql_query($sql); if (!$sql) { die('Consulta no válida: ' . mysql_error()); } if (mysql_num_rows($query) > 0) { $datos = array(); while($row = mysql_fetch_array($query)) { if($row["qnum"]==0) $style=""; if($row["qnum"]==1)$style="background-color:yellow"; if($row["qnum"]==2)$style="background-color:orange"; $datos[] = array( 'id_aviso' => $row['id_aviso'], 'telefonos' => $row['telefonos'], 'name' => utf8_encode($row['name']), 'apellidos' => utf8_encode($row['apellidos']), 'calle' => utf8_encode($row['calle']), 'localidad' => utf8_encode($row['localidad']), 'style' => $style ); } // convertimos el array de datos a formato json echo json_encode($datos); /* Tienes resultados. */ }else{ /*No tienes resultados. */ echo '[]'; } } ?> Un saludo |