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

Evitar resultados duplicados en consulta

Estas en el tema de Evitar resultados duplicados en consulta en el foro de Mysql en Foros del Web. El caso es que tengo una tabla pr_tipos_barra: id_tipo_barra: int PRIMARY tipo_barra: varchar id_bar_info: int Mi consulta a la tabla es la siguiente: SELECT DISTINCT ...
  #1 (permalink)  
Antiguo 11/04/2011, 12:19
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Pregunta Evitar resultados duplicados en consulta

El caso es que tengo una tabla pr_tipos_barra:
id_tipo_barra: int PRIMARY
tipo_barra: varchar
id_bar_info: int

Mi consulta a la tabla es la siguiente:
SELECT DISTINCT id_tipo_barra,tipo_barra FROM pr_tipos_barra WHERE id_bar_info='$id_bar_info'

Pero no logro evitar que me de resultados duplicados, alguna solución?
Muchas gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 11/04/2011, 14:15
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

Hacer un GROUP BY

Código SQL:
Ver original
  1. SELECT id_tipo_barra, tipo_barra
  2. FROM pr_tipos_barra
  3. WHERE id_bar_info='$id_bar_info'
  4. GROUP BY id_tipo_barra, tipo_barra
  #3 (permalink)  
Antiguo 11/04/2011, 14:24
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Si modifico la consulta y le añado GROUP BY de esta manera:
SELECT id_tipo_barra,tipo_barra FROM pr_tipos_barra WHERE id_bar_info='$id_bar_info' GROUP BY id_tipo_barra,tipo_barra
Sigue mostrando duplicados, y si en el GROUP BY le coloco id_bar_info, me devuelve solo los duplicados.
Alguna idea?
  #4 (permalink)  
Antiguo 11/04/2011, 14:28
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

Ponme un ejemplo, porque si haces un GROUP BY y te salen duplicados es una cosa extrañísima.
  #5 (permalink)  
Antiguo 11/04/2011, 14:47
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Verás, estoy usando estas funciones:
Código PHP:
function idbBarXtipoBar($idTipoBar)
    {
        
$Query="SELECT id_bar_info FROM pr_bar_info WHERE id_tipo_bar='$idTipoBar'";
        
$IdConsulta mysql_query($Query);
        
$NFilas mysql_num_rows($IdConsulta);
        
$matriz_total[0] = $NFilas;

        for(
$i=0;$i<$NFilas;$i++)
        {
                
$ResultQuery mysql_fetch_array($IdConsulta);
                
$matriz = array($ResultQuery["id_bar_info"]);
                
$matriz_total[$i+1] = $matriz;
        }
        return (
$matriz_total);
    }
function 
tiposBarra($id_bar_info)
    {
        
$Query="SELECT id_tipo_barra,tipo_barra FROM pr_tipos_barra WHERE id_bar_info='$id_bar_info' GROUP BY id_tipo_barra,tipo_barra";
        
$IdConsulta mysql_query($Query);
        
$NFilas mysql_num_rows($IdConsulta);
        
$matriz_total[0] = $NFilas;

        for(
$i=0;$i<$NFilas;$i++)
        {
                
$ResultQuery mysql_fetch_array($IdConsulta);
                
$matriz = array($ResultQuery["id_tipo_barra"],$ResultQuery["tipo_barra"]);
                
$matriz_total[$i+1] = $matriz;
        }
        return (
$matriz_total);

    } 
y llamo a la función para rellenar un select::
Código PHP:
$idbBarXtipoBar=$buscar->idbBarXtipoBar($idTipoBar);
echo 
'<label for="id_tipo_barra">Que sirvan:';
echo 
'</label>';
echo 
'<select id="id_tipo_barra" name="id_tipo_barra" onchange="submit()">';
    echo 
'<option></option>';
    for(
$ibtb=1;$ibtb<=$idbBarXtipoBar[0];$ibtb++)
    {
        
$tiposDeTapas=$buscar->tiposBarra($idbBarXtipoBar[$ibtb][0]);
        for(
$tdt=1;$tdt<=$tiposDeTapas[0];$tdt++)
        {
            echo 
'<option';
            if(
$id_tipo_barra==$tiposDeTapas[$tdt][0])
            {
                echo 
' selected="selected"';
            }
            echo 
' value="'.$tiposDeTapas[$tdt][0].'">'.$tiposDeTapas[$tdt][1].'</option>';
        }
    }
echo 
'</select>'
El caso es que como dije, no consigo que en el select no se dupliquen los resultados, este select forma parte de un buscador con selects relacionados, y a esta consulta le llega una variable $idTipoBar y a partir de ahí continúa, y estoy más perdido que el barco del arroz, no entiendo por qué se duplican, como bien dices, ORDER BY debería funcionar, pero no lo hace

Muchas gracias por tu ayuda, ya no se qué hacer para que funcione.
  #6 (permalink)  
Antiguo 12/04/2011, 00:25
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

Lanza la SELECT con el GROUP BY en el MySQL sin nada más de PHP y ponme el resultado (o una parte de él)
  #7 (permalink)  
Antiguo 12/04/2011, 05:34
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Primero de todo, muchas gracias por seguir intentándolo.
Si lanzo un solo SELECT, no me dará duplicados, me los da cuando relleno el array que depende de la condición id_bar_info="$id_bar_info", creo que no me explico muy bien, mira un ejemplo de algunos valores de la tabla pr_tipos_barra:
id_tipo_barra : 1 / tipo_barra : montaditos / id_bar_info: 1
id_tipo_barra : 2 / tipo_barra : montaditos / id_bar_info: 3
id_tipo_barra : 3 / tipo_barra : pinchos / id_bar_info: 5
id_tipo_barra : 4 / tipo_barra : pinchos / id_bar_info: 9

Luego al existir mismo tipo_barra para diferentes id_bar_info, el array me da duplicados.
Muchas gracias por tu paciencia.

Última edición por padapapoulos; 12/04/2011 a las 05:40
  #8 (permalink)  
Antiguo 12/04/2011, 07:51
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

Ah, acabaramos, pues entonces no muestres nada más que el tipo de barra y agrupa por ese campo

Código SQL:
Ver original
  1. SELECT tipo_barra
  2. FROM pr_tipos_barra
  3. WHERE id_bar_info='$id_bar_info'
  4. GROUP BY  tipo_barra
  #9 (permalink)  
Antiguo 12/04/2011, 08:14
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Ya probé así, y lo he vuelto a hacer por si cometí algún fallo, incluso probé con DISTINCT, pero sigue dándome duplicados, no lo entiendo, pensaba que estaba haciendo algo mal con la query, pero todos me dicen que tiene que funcionar, pegué el PHP por si se me estaba pasando algo por ahí, ya que el query está bien, no le veo la solución, estoy totalmente perdido :S
  #10 (permalink)  
Antiguo 12/04/2011, 08:30
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

¿Has visto que el el SELECT ya no esta el id y sólo está el tipo de barra?
  #11 (permalink)  
Antiguo 12/04/2011, 10:16
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Si lo he viso, entiendo que dudes, ya se que es muy raro, pero ya había probado antes todo lo que me has dicho, he vuelto a hacerlo por si se me había pasado algo, pero no, no se me ha pasado nada, lo he repasado una y otra vez y nada, llevo con esto al menos una semana y no logro encontrar una solución, me temo que tendré que pasar al plan b, que he estado evitando a toda costa, ya que implica replantear y reprogramar la forma de introducir los datos para evitar que se dupliquen los resultados en la tabla, lo cual me va a llevar otro tanto, pensaba que se podía hacer, pero si se puede, yo no se cómo :(
  #12 (permalink)  
Antiguo 12/04/2011, 11:56
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Mira lo que me tira el var_dump de este SELECT:
SELECT tipo_barra FROM pr_tipos_barra WHERE id_bar_info='$id_bar_info' GROUP BY tipo_barra
array(2) {
[0]=> string(10) "Bocadillos" ["tipo_barra"]=> string(10) "Bocadillos" } array(2) { [0]=> string(10) "Montaditos" ["tipo_barra"]=> string(10) "Montaditos" } array(2) { [0]=> string(5) "Tapas" ["tipo_barra"]=> string(5) "Tapas" } array(2) { [0]=> string(9) "Revueltos" ["tipo_barra"]=> string(9) "Revueltos" } array(2) { [0]=> string(6) "Tablas" ["tipo_barra"]=> string(6) "Tablas" } array(2) { [0]=> string(5) "Tapas" ["tipo_barra"]=> string(5) "Tapas" }

Se repite "Tapas"
  #13 (permalink)  
Antiguo 13/04/2011, 00:37
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

¿Puede ser que tenga un espacio antes o después y por eso te lo toma como distinto?

Por otra parte, tu BD está mal planteada porque no puedes tener dos tipos de barra iguales con distinto ID, deberías tener una tabla tipo de barra y una que relacione los tipos de barra con el id_bar.
  #14 (permalink)  
Antiguo 13/04/2011, 02:39
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

No, no tiene espacios, son exactamente igual, entiendo que el modelo de datos no es del todo optimo, en principio no parecía un gran problema, pensaba optimizarlo en una segunda fase, pero visto lo visto, tendré que replantearlo y optimizarlo desde ya, muchas gracias por intentar ayudarme.
  #15 (permalink)  
Antiguo 13/04/2011, 04:08
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 10 meses
Puntos: 89
Respuesta: Evitar resultados duplicados en consulta

No es que no sea optimo, es que incumple el paradigma de los esquemas Entidad-Relación. A parte te podría decir que es mejor hacer las cosas bien desde el principio que hacerlas a medias y luego optimizarlas, sobre todo el diseño de base de datos ya que toda la aplicación se construirá en base a ello y si luego lo cambias tendrás que cambiar toda la aplicación.
  #16 (permalink)  
Antiguo 13/04/2011, 05:03
 
Fecha de Ingreso: julio-2007
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Respuesta: Evitar resultados duplicados en consulta

Eso es cierto, siempre que empieces y termines tu mismo la aplicación y no existan prisas por parte del cliente final, la idea era hacerlo funcionar lo más rápido posible, pero ahora y gracias a este pequeño contratiempo, puedo demostrar que hay cosas que necesitan una revisión antes de continuar.

Etiquetas: distinct, duplicados
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 07:03.