Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Como arreglo esta consulta para que funcione bn!!

Estas en el tema de Como arreglo esta consulta para que funcione bn!! en el foro de Mysql en Foros del Web. Hola chicos que tal :D Tengo un problema y es que hace un tiempo pedi ayuda aca y me dieron la solucion solo que hoy ...
  #1 (permalink)  
Antiguo 08/08/2013, 10:40
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Como arreglo esta consulta para que funcione bn!!

Hola chicos que tal :D

Tengo un problema y es que hace un tiempo pedi ayuda aca y me dieron la solucion solo que hoy vi que la consulta no funcionaba del todo bn. La conculta saca un total de dies campos o registros pero es una consulta donde yo pongo un codigo del campo y este me saca 4 resgistros por encima y 4 por abajo (mayores y menores) pues bn pense que hjabia quedado de perlas no habia unos errores y pues le heche la culpa a la programacion pero ya mire bn y si la culpa es de la consulta.

No se como arreglarla pues estoy mirando sin embargo acudo a uds pues saben mas de esto les agradeceria:
Código MySQL:
Ver original
  1. SELECT nombre, cod, nick
  2.  
  3. SELECT us.nick, fo.nombre, fo.cod
  4. FROM usuario AS us, fotos AS fo, Libro AS li
  5. WHERE li.usuario = us.cod
  6. AND li.cod = fo.libro
  7. AND li.cod =  '448'
  8. ORDER BY ABS( fo.cod -668 )
  9. )T
y el resultado es

1094936_493486404071670_2071917617_n.png 677
246896_541431915918825_2104084677_n.jpg 676
1098470_566346040077589_994802732_n.png 675
1017503_591122110968317_1688457926_n.jpg 674
1010411_169184889933067_1176253905_n.jpg 673
954744_688599237831482_1133953858_n.jpg 672
408430_333762733407897_2124183187_n.jpg 671
382261_364379247012912_1383420384_n.jpg 670
397491_339107886206715_83456992_n.jpg 669
313855_363136953803808_1565442072_n.jpg 668

el problema es que debajo de 668 hay mas registros como lo muestra la siguiente consulta
Código MySQL:
Ver original
  1. SELECT cod, nombre
  2. FROM  `fotos`
  3. WHERE libro =448
  4. LIMIT 0 , 30

680 24647_460399814054318_228146063_n.jpg
679 1381_546833425374514_1789170407_n.jpg
678 1011150_601333843244842_459920928_n.jpg
677 1094936_493486404071670_2071917617_n.png
676 246896_541431915918825_2104084677_n.jpg
675 1098470_566346040077589_994802732_n.png
674 1017503_591122110968317_1688457926_n.jpg
673 1010411_169184889933067_1176253905_n.jpg
672 954744_688599237831482_1133953858_n.jpg
671 408430_333762733407897_2124183187_n.jpg
670 382261_364379247012912_1383420384_n.jpg
669 397491_339107886206715_83456992_n.jpg
668 313855_363136953803808_1565442072_n.jpg // ahi mas registros por debajo de ese numero y no es solo con esta es con casi todas
632 1004835_10151630686753881_1627833480_n.jpg
631 1002576_535224783227226_1364699619_n.jpg
630 553973_10151594774228995_1880958365_n.png
629 549507_186484178193482_1385793492_n.jpg
628 225213_366542473473224_1767063848_n.jpg
627 1095102_500013080068824_807114404_n.jpg
626 1098168_572904976084950_2084407758_n.jpg
625 73111_687616341263105_85717577_n.jpg

he tratado de aanalizar el problema pero me quedo corto por el momento :/ Ammmm por cierto:

Se puede hacer una consulta en la cual si por ejemplo es el ultimo registro este comience desde el primero?? por ejemplo en este seria si ya no hay mas que busque los cuatro primeros si ha llegado al ultimo o que busque los cuatro ultimo si ha llegado al primero

Gracias chicos por la atencion y pues para mysql si estoy no tan ducho
  #2 (permalink)  
Antiguo 08/08/2013, 11:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como arreglo esta consulta para que funcione bn!!

Es un tema de lógica que se esconde detrás del método usado: para que el método que usas funcione no deben existir discontinuidades en los códigos de las fotos. De lo contrario, sólo te devolverá aquellos cuya diferencia por su valor absoluto sea más próxima.
En otras palabras, si los diez siguientes existen, pero se borraron los diez precedentes, entonces sólo te devolverá los diez mayores.
Para que te devuelva los anteriores y posteriores debes hacer la consulta con UNION segmentando las búsquedas:
Código MySQL:
Ver original
  1.     SELECT * FROM
  2.     (SELECT fo.nombre, fo.cod, us.nick
  3.     FROM usuario us
  4.         INNER JOIN fotos fo ON li.usuario = us.cod
  5.         INNER JOIN Libro li ON li.cod = fo.libro
  6.     WHERE li.cod =  '448'
  7.     AND fo.cod > 668
  8.     LIMIT 5) T1
  9.     UNION  
  10.     SELECT * FROM
  11.     (SELECT fo2.nombre, fo2.cod, us2.nick
  12.     FROM usuario us2
  13.         INNER JOIN fotos fo2 ON li2.usuario = us2.cod
  14.         INNER JOIN Libro li2 ON li2.cod = fo2.libro
  15.     WHERE li2.cod =  '448' AND fo2.cod <= 668
  16.     LIMIT 6)T2

Por cierto: No uses JOIN implícito. Usa el explícito. Tiene mejor performance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 09/08/2013, 15:32
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Como arreglo esta consulta para que funcione bn!!

gnzsoloyo hize tu consulta pero no me funciono me mostro un error en el sintax asi que mire bn donde era el problema y lo arregle pero ahora el problema es de columnas desconocidas y ya he hecho cambios pero nada sigue el error
Código MySQL:
Ver original
  1.     SELECT * FROM (
  2.         SELECT fo.nombre, fo.cod, us.nick
  3.         FROM usuario us
  4.         INNER JOIN fotos fo ON li.usuario = us.cod
  5.         INNER JOIN Libro li ON li.cod = fo.libro
  6.         WHERE li.cod =  '448'
  7.         AND fo.cod > 668
  8.         LIMIT 5)
  9.     T1 UNION  
  10.     SELECT * FROM (
  11.         SELECT fo2.nombre, fo2.cod, us2.nick
  12.         FROM usuario us2
  13.         INNER JOIN fotos fo2 ON li2.usuario = us2.cod
  14.         INNER JOIN Libro li2 ON li2.cod = fo2.libro
  15.         WHERE li2.cod =  '448' AND fo2.cod <= 668
  16.         LIMIT 6)
  17.     T2 ORDER BY cod DESC)
  18. T3 ORDER BY COD;
en esta me dice: "ERROR 1054 (42S22): Unknown column 'li2.usuario' in 'on clause'"
tonces la volvi a modificar
Código MySQL:
Ver original
  1.     SELECT * FROM (
  2.         SELECT fo.nombre, fo.cod, us.nick
  3.         FROM usuario us
  4.         INNER JOIN fotos fo ON li.usuario = us.cod
  5.         INNER JOIN Libro li ON li.cod = fo.libro
  6.         WHERE li.cod =  '448'
  7.         AND fo.cod > 668
  8.         LIMIT 5)
  9.     T1 UNION  
  10.     SELECT * FROM (
  11.         SELECT fo2.nombre, fo2.cod, us2.nick
  12.         FROM usuario AS us2, fotos as fo2, Libro as li2
  13.         INNER JOIN fotos fo2 ON li2.usuario = us2.cod
  14.         INNER JOIN Libro li2 ON li2.cod = fo2.libro
  15.         WHERE li2.cod =  '448' AND fo2.cod <= 668
  16.         LIMIT 6)
  17.     T2 ORDER BY cod DESC)
  18. T3 ORDER BY COD;
y este es el error: "ERROR 1066 (42000): Not unique table/alias: 'fo2'" y pues pense que en vez de tanto cambiarla mas bn te pregunto a ti si me puedes ayudar a arreglarla que encerio lo mio es la programacion y nunca en mi vida hasta ahora se me habia atrevesado este problema :(
  #4 (permalink)  
Antiguo 12/08/2013, 12:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como arreglo esta consulta para que funcione bn!!

No he mirado nada realmente, sino solamente quitado subconsultas que no creo que sean necesarias. Prueba algo así a ver qué ocurre.

Código MySQL:
Ver original
  1. (SELECT fo.nombre, fo.cod, us.nick
  2.     FROM usuario us
  3.         INNER JOIN fotos fo ON li.usuario = us.cod
  4.         INNER JOIN Libro li ON li.cod = fo.libro
  5.     WHERE li.cod = '448'
  6.     AND fo.cod > 668
  7.     LIMIT 5)
  8.     UNION  
  9.     (SELECT fo2.nombre, fo2.cod, us2.nick
  10.     FROM usuario us2
  11.         INNER JOIN fotos fo2 ON li2.usuario = us2.cod
  12.         INNER JOIN Libro li2 ON li2.cod = fo2.libro
  13.     WHERE li2.cod =  '448' AND fo2.cod <= 668
  14.     LIMIT 6)
  #5 (permalink)  
Antiguo 12/08/2013, 22:24
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Como arreglo esta consulta para que funcione bn!!

Unknown column 'li.usuario' in 'on clause' me sale esto :(
  #6 (permalink)  
Antiguo 13/08/2013, 02:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como arreglo esta consulta para que funcione bn!!

perdón, ahora veo el problema
FROM usuario us
INNER JOIN fotos fo ON li.usuario = us.cod
INNER JOIN Libro li ON li.cod = fo.libro

No estás haciendo los INNER JOIN bien. Observa que en el primer INNER JOIN unes las tablas usuario cuyo alias es us con fotos cuyo alias es fo, y el INNER JOIN entre ellas es ON li.usuario = us.cod. Eso no puede ser, pues todavía no has hecho referencia a la tabla Libro, a la que llamas más adelante. Deberías unir en el primer INNER JOIN campos de usuario y de fotos, es decir, con li. y us. por delante y no con li.

Si fotos tiene algún campo que se relacione con cod de usuarios, llamado por ej. cod, tendría que ser ON us.cod = fo.cod.
Deberías decirnos los campos de las tablas y los que se relacionan entre sí para poder ayudarte mejor.

Última edición por jurena; 13/08/2013 a las 02:07
  #7 (permalink)  
Antiguo 16/08/2013, 20:58
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Como arreglo esta consulta para que funcione bn!!

ok pues bueno aqui lso campos
Código MySQL:
Ver original
  1. /*tabla fotos*/
  2. +---------------+---------------+------+-----+---------+----------------+
  3. | Field         | Type          | Null | Key | Default | Extra          |
  4. +---------------+---------------+------+-----+---------+----------------+
  5. | cod           | int(11)       | NO   | PRI | NULL    | auto_increment |
  6. | nombre        | varchar(200)  | NO   |     | NULL    |                |
  7. | libro         | bigint(20)    | YES  |     | NULL    |                |
  8. | clasificacion | bigint(20)    | YES  |     | NULL    |                |
  9. | fecha         | date          | NO   |     | NULL    |                |
  10. | hora          | time          | NO   |     | NULL    |                |
  11. +---------------+---------------+------+-----+---------+----------------+
  12.  
  13. /*libro es el codigo del libro*/
  14.  
  15. /*tabla Libro*/
  16. +----------+-------------+------+-----+---------+----------------+
  17. | Field    | Type        | Null | Key | Default | Extra          |
  18. +----------+-------------+------+-----+---------+----------------+
  19. | cod      | bigint(20)  | NO   | PRI | NULL    | auto_increment |
  20. | nombre   | varchar(50) | NO   |     | NULL    |                |
  21. | usuario  | bigint(20)  | YES  |     | NULL    |                |
  22. | permisos | smallint(6) | YES  |     | NULL    |                |
  23. | fecha    | date        | NO   |     | NULL    |                |
  24. | hora     | time        | NO   |     | NULL    |                |
  25. +----------+-------------+------+-----+---------+----------------+
  26.  
  27. /*usuario es el cod del usuario*/
  28.  
  29.  
  30. /*Tabla usuario*/
  31. +---------------+---------------+------+-----+---------+----------------+
  32. | Field         | Type          | Null | Key | Default | Extra          |
  33. +---------------+---------------+------+-----+---------+----------------+
  34. | cod           | bigint(20)    | NO   | PRI | NULL    | auto_increment |
  35. | nick          | varchar(30)   | YES  | UNI | NULL    |                |
  36. | nombres       | varchar(30)   | YES  |     | NULL    |                |
  37. | apellidos     | varchar(30)   | YES  |     | NULL    |                |
  38. | ciudad        | bigint(20)    | YES  |     | NULL    |                |
  39. | fechaRegistro | date          | YES  |     | NULL    |                |
  40. | hora          | time          | YES  |     | NULL    |                |
  41. +---------------+---------------+------+-----+---------+----------------+

listos pues ahi esta casi todo los campos (no puse todos por seguridad pero estan los que se necesitan) todos estan con el foreign key bn hecho
por cierto miren la pregunta para que no nos desviemos del tema gracias jurena :D
  #8 (permalink)  
Antiguo 17/08/2013, 03:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Como arreglo esta consulta para que funcione bn!!

si haces esta consulta, ¿qué ocurre?
Código MySQL:
Ver original
  1.   T1.nick,
  2.   T1.nombre,
  3.   T1.cod
  4.   us.nick,
  5.   fo.nombre,
  6.   fo.cod
  7.      FROM libro li
  8.        INNER JOIN usuarios us ON li.usuario = us.cod
  9.        INNER JOIN fotos fo ON li.cod = fo.libro
  10.                 WHERE li.cod = '448' AND fo.cod > 668 LIMIT 5)
  11.   us.nick,
  12.   fo.nombre,
  13.   fo.cod
  14.      FROM libro li
  15.           INNER JOIN usuarios us ON li.usuario = us.cod
  16.           INNER JOIN fotos fo ON li.cod = fo.libro
  17.               WHERE li.cod = '448' AND fo.cod <= 668 LIMIT 6))T1
  18.  ORDER BY T1.cod

Para lo de seguir con la numeración desde el principio, creo que deberías usar algo de programación, aunque primero hay que ver si esto te da lo que quieres.
  #9 (permalink)  
Antiguo 17/08/2013, 12:30
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: Como arreglo esta consulta para que funcione bn!!

pues bueno con el tuyo solo se pone una de las dos opciones (mayor o menor) pero no las dos osea que el numero que quiero no queda en el medio :( pero pues bueno aunque sea funciono. Pues decidi intentarlo de otra forma más bn y es hacer la consulta completa y guardarla en un arrary y con eso tengo todos los valores el problema es saber en que posicion del array esta la foto que yo quiero para que quede en la mitad (la consulta que queria hacer) pero gracias de todas maneras a todos :D sobre todo a ti jurena

Etiquetas: arreglo, campo, registro, registros, select, sql
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 09:28.