PHP-Hispano.net Comunidad hispana de desarrollo web

Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?

2489 usuarios Online (0)

Darse de alta en la web | Recuperar password   
Inicio / Foros / MySQL / Mostrar registros

Mostrar registros [SOLUCIONADO]

8 respuestas 477 visitas Categoría MySQL

Mostrar registros

Avatar de cesar
* * * * * * *

(Nivel 3 - 221 posts)

#0 Offline cesar Usuario 02 abr 09
Hola amigos tengo un peque problema, tengo un select mediante el cual muestra notificaciones realizadas a un determinado cliente, estas notificaciones muestran algunos datos, el problema quye tengo es por ejemplo si yo realizo 100 notificaciones y el cliente entra a confirmar uno de esos productos deberia solo aparrecerle una sola vez esto deberia basarse en el nombre del dominio es decir si el nombre del dominio se repite mas de una vez al cliente deberia mostrarle solo una vez no 100 veces.

Este es mi select

SELECT DISTINCT P.PRODUC_CODIGO, U.USUARI_CODIGO, N.NOTIF_PAGAR,N.NOTIF_FECHVENDOM,N.NOTIF_FECHVENPAQ,P.PRODUC_DESCRIP,N.NOTIF_OBSERVACIONES,N.NOTIF_DOMINIO
FROM
I_NOTIF N,
G_USUARIOS U,
I_PRODUC P
WHERE
U.USUARI_CODIGO = N.USUARI_CODIGO AND
P.PRODUC_CODIGO = N.PRODUC_CODIGO AND
N.USUARI_CODIGO=$_SESSION[s_id]

Gracias a todos

SOLUCIÓN PuntuaciónPuntuaciónPuntuaciónRe: Mostrar registros

Avatar de jurena
* * * * * * *

(Nivel 7 - 1648 posts)

#1 Offline jurena Moderador 03 abr 09
el problema es que el distinct solo funciona como tal sobre un único campo cuando en el select está solo ese campo: el distinct afecta a toda la selección. Me explicaré: Si tú tienes 100 veces el mismo valor (por ej. 1) en el campo campo1, y en el campo 2 tienes valores distintos, SELECT distinct campo1 from tabla te mostrará sólo un valor, puesto que en realidad funciona como un GROUP BY campo1, pero si escribes SELECT distinct campo1, campo2 FROM tabla, te mostrará los distintos del campo2, es decir, 1,1; 1,2, etc., pero si hubiera dos o más 2 en el campo 2, mostraría sólo un 1,2. Es decir busca en el primer campo valores distintos y luego para cada valor distinto del primer campo busca valores distintos del segundo y te los muestra. Si hubiera en el select un tercer campo con las letras a, b, c, te mostraría registros que tuvieran estos datos 1,1,a; 1,1,b; 1,1,c
Es decir, el distinct afecta a toda la selección y no sólo al primer campo del SELECT.
César, dinos cuál es el dato o datos que no quieres que se repita (me refiero al campo o campos), cuéntanos algo más sobre las relaciones de las tablas y la naturaleza de los datos, e intentaremos proporcionarte una consulta. Ello requerirá alguna consulta anidada. Pero puede hacerse. Para ello necesitamos más detalles sobre la lógica de la consulta y la naturaleza de los datos.

Re: Mostrar registros

Avatar de cesar
* * * * * * *

(Nivel 3 - 221 posts)

#2 Offline cesar Usuario 03 abr 09
Muchas gracias Jurena entendi claramente tu respuesta te adjunto los datos extras que mencionas

Aqi esta el reporte que me sale http://www.servicomecuador.com/pruebas/reporte.JPG
La explicación:
La idea seria que no me muestre nuevamente cualesquiera de las lineas que contiene en el nombre del dominio juanito.com en vista que son los mismos. Esta tabla contiene básicamente notificaciones que se hace al cliente que su dominio se va a caducar por lo tanto cuando el vaya a confirmar el cliente solo deberia aparecer solo 1 vez el dominio juanito.com a pesar de que se le haya enviado 100 recordatorios, por ejemplo

Los campos y el contenido que tiene la tabla principal que se llama I_NOTIF


CREATE TABLE IF NOT EXISTS `i_notif` (
`NOTIF_CODIGO` int(5) NOT NULL AUTO_INCREMENT,
`USUARI_CODIGO` int(4) DEFAULT NULL,
`PRODUC_CODIGO` int(5) DEFAULT NULL,
`NOTIF_FECHA` varchar(30) NOT NULL,
`NOTIF_DOMINIO` varchar(50) NOT NULL,
`NOTIF_VALDOM` varchar(5) NOT NULL,
`NOTIF_FECHREGDOM` varchar(30) NOT NULL,
`NOTIF_FECHVENDOM` varchar(30) NOT NULL,
`NOTIF_VALPAQ` varchar(5) NOT NULL,
`NOTIF_FECHREGPAQ` varchar(30) NOT NULL,
`NOTIF_FECHVENPAQ` varchar(30) NOT NULL,
`NOTIF_SUBTOTAL` varchar(5) NOT NULL,
`NOTIF_PAGAR` varchar(5) NOT NULL,
`NOTIF_EMAIL` varchar(50) NOT NULL,
`NOTIF_OBSERVACIONES` varchar(1000) NOT NULL,
PRIMARY KEY (`NOTIF_CODIGO`),
KEY `RELATIONSHIP_13_FK` (`PRODUC_CODIGO`),
KEY `RELATIONSHIP_15_FK` (`USUARI_CODIGO`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

INSERT INTO `i_notif` (`NOTIF_CODIGO`, `USUARI_CODIGO`, `PRODUC_CODIGO`, `NOTIF_FECHA`, `NOTIF_DOMINIO`, `NOTIF_VALDOM`, `NOTIF_FECHREGDOM`, `NOTIF_FECHVENDOM`, `NOTIF_VALPAQ`, `NOTIF_FECHREGPAQ`, `NOTIF_FECHVENPAQ`, `NOTIF_SUBTOTAL`, `NOTIF_PAGAR`, `NOTIF_EMAIL`, `NOTIF_OBSERVACIONES`) VALUES
(1, 2, 3, '01-04-2009 19:57:52', 'juanito.com', '8.95', '2009-04-01', '2010-04-01', '0', '2009-04-01', '2010-04-01', '8.95', '8.95', 'soporte@rmsoluciones.net', ''),
(2, 2, 3, '01-04-2009 20:12:16', 'cesar.com', '0', '2009-04-01', '2009-04-01', '16', '', '', '16.00', '16.00', 'soporte@rmsoluciones.net', 'prueba a ver si graba'),
(3, 2, 3, '01-04-2009 20:40:40', 'juanito.com', '8.95', '2009-04-01', '2010-04-01', '0', '2009-04-01', '2010-04-01', '8.95', '8.95', 'soporte@rmsoluciones.net', 'una mas');


Muchas gracias

Re: Mostrar registros

Avatar de jurena
* * * * * * *

(Nivel 7 - 1648 posts)

#3 Offline jurena Moderador 03 abr 09
César,
proporcióname las otras dos tablas y algunos datos aunque sean inventados para la ocasión, y dinos qué buscas y cómo quieres mostrarlo. Eso con un ejemplo concreto. Algo así como: Busco todos los productos del número de usuario tal y quiero mostrar los siguientes datos de esta o aquella tabla y quiero mostrarlos de la siguiente manera. Con los datos que proporciono debería salir.

Re: Mostrar registros

Avatar de cesar
* * * * * * *

(Nivel 3 - 221 posts)

#4 Offline cesar Usuario 03 abr 09
Hola Jurena gracias te adjunto lo solicitado

Tabla Usuarios con datos

CREATE TABLE IF NOT EXISTS `g_usuarios` (
`USUARI_CODIGO` int(4) NOT NULL AUTO_INCREMENT,
`CATUSU_CODI` int(2) NOT NULL,
`USUARI_EMPRESA` varchar(80) NOT NULL,
`USUARI_CONTACTO` varchar(80) NOT NULL,
`USUARI_DIREC` varchar(500) NOT NULL,
`USUARI_TELEF` varchar(20) NOT NULL,
`USUARI_CELULAR` varchar(20) DEFAULT NULL,
`USUARI_EMAIL` varchar(60) NOT NULL,
`USUARI_EMAIL1` varchar(60) DEFAULT NULL,
`USUARI_LOGIN` varchar(10) NOT NULL,
`USUARI_CLAVE` varchar(70) NOT NULL,
`USUARI_NIVEL` varchar(1) NOT NULL,
`USUARI_STATUS` varchar(3) NOT NULL,
`USUARI_FECHREG` datetime NOT NULL,
PRIMARY KEY (`USUARI_CODIGO`),
KEY `R_CATUSU_USUARI_FK` (`CATUSU_CODI`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `g_usuarios`
--

INSERT INTO `g_usuarios` (`USUARI_CODIGO`, `CATUSU_CODI`, `USUARI_EMPRESA`, `USUARI_CONTACTO`, `USUARI_DIREC`, `USUARI_TELEF`, `USUARI_CELULAR`, `USUARI_EMAIL`, `USUARI_EMAIL1`, `USUARI_LOGIN`, `USUARI_CLAVE`, `USUARI_NIVEL`, `USUARI_STATUS`, `USUARI_FECHREG`) VALUES
(1, 1, 'Servicom', 'Ing. C?sar Mart?nez', 'Quito', '2554271', '099371317', 'cmartinez@servicomecuador.com', NULL, 'cmartinez', 'f4c9473e7feb41292931d68f79f8303d', '0', 'ACT', '2009-03-31 20:53:04'),
(2, 2, 'Rm Soluciones', 'Roberto Martinez', 'Quito', '2554271', '099809622', 'soporte@rmsoluciones.net', '', 'rmsolucion', '34141a270bbeb2abc51fd645ffc230cf', '1', 'ACT', '2009-03-31 21:56:37');

Tabla Productos con datos

CREATE TABLE IF NOT EXISTS `i_produc` (
`PRODUC_CODIGO` int(5) NOT NULL AUTO_INCREMENT,
`PRODUC_NOMBRE` varchar(80) NOT NULL,
`PRODUC_DESCRIP` varchar(1000) NOT NULL,
`PRODUC_CONDICION` varchar(2) NOT NULL,
`PRODUC_PRECIO` varchar(5) NOT NULL,
`PRODUC_MENSUAL` varchar(5) DEFAULT NULL,
`PRODUC_STATUS` varchar(3) NOT NULL,
PRIMARY KEY (`PRODUC_CODIGO`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Volcar la base de datos para la tabla `i_produc`
--

INSERT INTO `i_produc` (`PRODUC_CODIGO`, `PRODUC_NOMBRE`, `PRODUC_DESCRIP`, `PRODUC_CONDICION`, `PRODUC_PRECIO`, `PRODUC_MENSUAL`, `PRODUC_STATUS`) VALUES
(1, 'Paquete Hosting B?sico', '-500 MB de espacio\r\n- 10 GB de transferencia al mes\r\n- Todo ilimitado\r\n- Dominio gratis para el primer a?o', 'SI', '40', '0', 'ACT'),
(2, 'Paquete Reseller B?sico', '- 10 Gb de transferencia \r\n- 50 Gb de transferencia al mes\r\n- Panel WHM de administracion', 'SI', '220', '0', 'ACT'),
(3, 'Dominios Gen?ricos', 'Nombres de dominio con extensi?n .com .net o .org', 'SI', '16', '0', 'ACT');


Lo que quiero que muestre es
El paquete que se notifico pero una sola vez, es decir en el reporte que te adjunte el vínculo ahí esta los datos que deberia mostrar, el problema que tengo ahi es que si yo hago 100 notificaciones del mismo paquete llamemoslo asi al cliente le salen los 100 a pesar de que es el mismo paquete. La idea seria que solo le muestre uno ya que el deberá renovar su paquete una sola vez las notificaciones se usan para avisarle al cliente que esta cerca su caducidad.

Gracias

Re: Mostrar registros

Avatar de jurena
* * * * * * *

(Nivel 7 - 1648 posts)

#5 Offline jurena Moderador 03 abr 09
a ver si he entendido, César,
SELECT P.PRODUC_CODIGO, U.USUARI_CODIGO, N.NOTIF_PAGAR, N.NOTIF_FECHVENDOM, N.NOTIF_FECHVENPAQ, P.PRODUC_DESCRIP, N.NOTIF_OBSERVACIONES, N.NOTIF_DOMINIO
FROM I_NOTIF N
INNER JOIN G_USUARIOS U ON U.USUARI_CODIGO = N.USUARI_CODIGO INNER JOIN
I_PRODUC P ON P.PRODUC_CODIGO = N.PRODUC_CODIGO WHERE N.USUARI_CODIGO =2
GROUP BY N.NOTIF_DOMINIO

Pero esta te traerá los datos de la primera notificación almacenada. Si deseas mostrar los de la última, habrá que hacer una anidada. Dime si he entendido y qué es lo que quieres.

EDITO:
si quieres sacar la última notificación (la de fecha más reciente) para cada dominio:

SELECT P.PRODUC_CODIGO, U.USUARI_CODIGO, N.NOTIF_PAGAR, N.NOTIF_FECHVENDOM, N.NOTIF_FECHVENPAQ, P.PRODUC_DESCRIP, N.NOTIF_OBSERVACIONES, N.NOTIF_DOMINIO
FROM I_NOTIF N
INNER JOIN G_USUARIOS U ON U.USUARI_CODIGO = N.USUARI_CODIGO
INNER JOIN I_PRODUC P ON P.PRODUC_CODIGO = N.PRODUC_CODIGO
INNER JOIN (

SELECT i.USUARI_CODIGO uscodigo, max( i.NOTIF_FECHA ) fecha_max, i.notif_dominio domin
FROM i_notif i
WHERE i.USUARI_CODIGO =2
GROUP BY i.USUARI_CODIGO, i.notif_dominio
)t1 ON U.USUARI_CODIGO = t1.uscodigo
AND N.NOTIF_FECHA = t1.fecha_max
AND t1.domin = N.NOTIF_DOMINIO

Ponlo a prueba.

Re: Mostrar registros

Avatar de cesar
* * * * * * *

(Nivel 3 - 221 posts)

#6 Offline cesar Usuario 03 abr 09
Hola Jurena muchas gracias te comento que al correr este sql sale un mensaje que dice no existen datos que mostrar

Gracias

SOLUCIÓN PuntuaciónPuntuaciónPuntuaciónRe: Mostrar registros

Avatar de jurena
* * * * * * *

(Nivel 7 - 1648 posts)

#7 Offline jurena Moderador 03 abr 09
César,
yo tengo que el usuari_codigo 2 aparece en varias notificaciones. Mira si tú tienes lo mismo. Pues si tu usuari_codigo 2 no tiene notificaciones, es lógico el resultado.
La consulta es esta:
SELECT P.PRODUC_CODIGO, U.USUARI_CODIGO, N.NOTIF_PAGAR, N.NOTIF_FECHVENDOM, N.NOTIF_FECHVENPAQ, P.PRODUC_DESCRIP, N.NOTIF_OBSERVACIONES, N.NOTIF_DOMINIO
FROM I_NOTIF N
INNER JOIN G_USUARIOS U ON U.USUARI_CODIGO = N.USUARI_CODIGO
INNER JOIN I_PRODUC P ON P.PRODUC_CODIGO = N.PRODUC_CODIGO
INNER JOIN (

SELECT i.USUARI_CODIGO uscodigo, max( i.NOTIF_FECHA ) fecha_max, i.notif_dominio domin
FROM i_notif i
WHERE i.USUARI_CODIGO =2
GROUP BY i.USUARI_CODIGO, i.notif_dominio
)t1 ON U.USUARI_CODIGO = t1.uscodigo
AND N.NOTIF_FECHA = t1.fecha_max
AND t1.domin = N.NOTIF_DOMINIO

Pero donde pone 2, pon el número de un usuario que tenga notificaciones.

Re: Mostrar registros

Avatar de cesar
* * * * * * *

(Nivel 3 - 221 posts)

#8 Offline cesar Usuario 03 abr 09
Hola Jurena Maestro ese select ahi si ya funciono, muchas gracias por la ayuda nunca le iba a dar a este tremendo select. Por cierto en el post anterior si cambie el usuario peor no era ese el problema, gracias nuevamente, estoy ahora luchando con otro select esperemos que no sea tan largo como este otro


César

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

php-hispano.net 2002 - 2010 | XHTML 1.0
Datos Legales | Webmaster