Foros del Web » Programando para Internet » PHP »

Duda chapucera

Estas en el tema de Duda chapucera en el foro de PHP en Foros del Web. Hola, estoy aprendiendo a manejar MySQL mediante PHP y hay algunas cosas que no alcanzo a entender. Mi objetivo es insertar una calle nueva en ...
  #1 (permalink)  
Antiguo 05/02/2009, 06:04
Avatar de kanakis  
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 15 años, 6 meses
Puntos: 0
Duda chapucera

Hola, estoy aprendiendo a manejar MySQL mediante PHP y hay algunas cosas que no alcanzo a entender.

Mi objetivo es insertar una calle nueva en una tabla `calles`donde una calle dada por su nombre no exista aún. Se me ha ocurrido una idea feliz de coherencia más que dudosa:

Código:
$insertar_calle="INSERT INTO calles (ID,VIA,CALLE,MUNICIPIO) 
VALUES (NULL,'".$via."','".$calle."','".$municipio."')
WHERE NOT EXISTS (SELECT * FROM calles WHERE CALLE='".$calle."')";

mysql_query($insertar_calle) or die("Error al insertar nueva calle:
".mysql_error());
Sé que estoy metiendo la pata en la sintaxis, pero no sé muy bien cómo manejar las cosultas tipo "si un registro no existe, insértalo".

Gracias de antemano :)
  #2 (permalink)  
Antiguo 05/02/2009, 07:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda chapucera

Te recomiendo que leas la posibilidades que tienes


12.2.5. INSERT Syntax


ese where no va....!!!

a parte, creo que si funcionará tampoco haria lo que quieres, puesto que limitarias por el nombre pero no por el municipio...

Lo que quieres lo puedes conseguir creando un indice unico sobre el o los campos que quieres que sean unicos... al intentar insertar una repetición abortará el INSERT INTO

Quim
  #3 (permalink)  
Antiguo 05/02/2009, 09:11
Avatar de kanakis  
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Duda chapucera

Gracias por la respuesta, quimfv! No se me había ocurrido lo de usar CALLE y MUNICIPIO como índice único!

El único problema es que yo pretendo hacer esto:

Código:
$result = mysql_db_query("datos","SELECT * FROM clientes",$db);

while($row = mysql_fetch_array($result)){

      $insercion="INSERT INTO calles (ID, VIA, CALLE, MUNICIPIO) 
      VALUES (NULL,'".$row["VIA"]."','".$row["Calle"]."','".$row["Municipio"]."')";

       mysql_db_query("glp",$insercion,$db) or die("Error:".mysql_error());

}
En una misma calle pueden vivir muchos clientes, así que si quiero actualizar la tabla "calles" con las de todos los clientes, habrá muchas que estarán duplicadas y por tanto se abortarán todas las inserciones restantes:

Código:
Duplicate entry 'PLAZA DE ESPAÑA-MADRID' for key 'CALLE'


EDITO: Problema solucionado añadiendo
Código:
ON DUPLICATE KEY UPDATE ID=ID
. Lo que no sé es si será la solución más elegante

Última edición por kanakis; 05/02/2009 a las 09:49
  #4 (permalink)  
Antiguo 05/02/2009, 16:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda chapucera

No entiendo que quieres hacer ...
precisamente esa es la gracia que aborte el insert que ya insertaste para otro cliente....

Si ya tienes la calle tienen que abortar todos los intentos posteriores de insertar la...

Y eso de Id=Id no tiene ningun sentido...

Quim
  #5 (permalink)  
Antiguo 05/02/2009, 18:27
Avatar de kurokishi  
Fecha de Ingreso: enero-2009
Ubicación: Tenochtitlán
Mensajes: 109
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Duda chapucera

Pues yo creoque primero deberias checar que exista la calle, con un select, en dado de que no exista debes introducir los datos, pero si existen entonces deberias hacer el UPDATE. Ademas, creo que deberias de cambiar tu llave primaria por clientes, ya que como dices, puede que muchos clientes vivan en la misma calle, pero en la misma calle es remotamente posible que haya 2 o mas clientes con el mismo nombre.
Salu2!
  #6 (permalink)  
Antiguo 06/02/2009, 09:41
Avatar de kanakis  
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: Duda chapucera

Perdonad mi ignorancia, pero como decía al principio estoy en proceso de aprendizaje. Creo que no he explicado bien mis intenciones, así os las detallaré para que podáis echarme un cable.

Tengo dos tablas con los campos siguientes:
  • clientes: (NIF, titular, calle, numero,... municipio, ...)
  • calles: (ID, via, calle, municipio)

Donde clientes.NIF es una clave primaria y única de clientes, calles.ID es la clave primaria y única de clientes, y donde los campos calle-municipio de "calles" forman una clave única.

Por otro lado, tengo una página en PHP que realiza la siguiente consulta: Seleccionar en la tabla "clientes" todas las calles que no existan en la tabla "calles" e insertarlas en ésta. Es decir, una especie de actualización de la tabla "calles" en función de "clientes". Aquí surge el problema. Si hago ésto:

Código:
$result = mysql_db_query("datos","SELECT * FROM clientes",$db);

while($row = mysql_fetch_array($result)){

      $insercion="INSERT INTO calles (ID, VIA, CALLE, MUNICIPIO) 
      VALUES (NULL,'".$row["VIA"]."','".$row["Calle"]."','".$row["Municipio"]."')";

       mysql_db_query("glp",$insercion,$db) or die("Error:".mysql_error());
}
El bucle que inserta calles se detiene en cuanto encuentra una repetida, por lo que la tabla "calles" se queda a medio actualizar. Yo sospecho que la clave de la solución se encuentra en la consulta inicial:

Código:
"SELECT * FROM clientes" 
Esto selecciona todos los clientes en lugar de sólo aquellos en los que la calle no está repetida, así que quizás por eso no puedo insertarlos todos. ¿Serviría hacer algo así?

Código:
"SELECT * FROM clientes, calles
WHERE clientes.calle  <> calles.calle" 
¿Cómo lo implementaríais vosotros? Creo que lo que quiero hacer en realidad es bien sencillo, sólo que estoy demasiado pegado. Gracias de nuevo, perdonad la molestia y un saludo.
  #7 (permalink)  
Antiguo 10/02/2009, 02:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda chapucera

Ahora si te endendi....


SELECT VIA, CALLE, MUNICIPIO FROM clientes group by VIA, CALLE, MUNICIPIO;


Si cambias la primera query por esto te funcionará. Puesto que esta solo te darà las calles una vez. Por tanto no intenetaràs insertar dos veces la misma calles. Puede seguir el problema con las calles que ya esten en la tabla calles... esto lo puedes solucionar quitando el " or die("Error:".mysql_error());" con lo que el bucle seguirá aún que en una de sus iteraciones no se ejecute el insert. Si no quieres sacar, el "or die" por seguridad luego tienes que complicar la query


Código:
SELECT cli.via, cli.calle, cli.municipio
FROM clientes AS cli LEFT JOIN calles AS cll 
ON cli.municipio = cll.municipio AND cli.calle = cll.calle AND cli.via = cll.via
GROUP BY cli.via, cli.calle, cli.municipio, cll.via, cll.calle, cll.municipio
HAVING cll.via Is Null AND cll.calle Is Null AND cll.municipio Is Null;
Ahora te dará las calles de clientes una sola vez que no esten en calles.


Dos comentarios:

El indice unico lo tendras que extender a VIA, no sea que tengas en un mismo municipo una calle y una plaza o un pasaje con el mismo nombre (en mi ciudad esto se da). Pero ese indice lo tienes que poner en la tabla calles no en clientes, si no no podras entrar clientes de la misma calle y municipio

Tendrias que ir pensando como evitar que te entren calles repetidas....es difícil tener un nomenclator completo, especialmente si trabajas sobre un area muy grande...no se. (Este no se como resolver lo)


EDITO/COMPLEMENTO: Lo suyo seria que al final en la tabla clientes se guardara un id relacionado con el id de la tabla calles asi ahorrarias espacio, y la base estaria normalizada.

Quim

Última edición por quimfv; 10/02/2009 a las 02:44
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 16:14.