TransWikia.com

tengo un buscador el cual me toma registros repetidos, como hago para solucionarlo?

Stack Overflow en español Asked by Bell on March 3, 2021

tengo dos tablas es mi BD una llamada publicacion y la otra publicaciondet.
la tabla publicacion tiene los siguientes campos

1   codPublicacion  int(11) AUTO_INCREMENT  
2   tipoPublicacion char(1) 
3   desPublicacion  varchar(100)
4   ubiPublicacion  varchar(25) 
6   nomPublicacion  varchar(20)
7   fecPublicacion  datetime

y la tabla publicaciondet

1   codPubDetPrimaria   int(11)
3   codPublicacion  int(11) foreing key
4   arcPubDet   varchar(100)

en el campo arcPubDet se guarda el nombre de las imágenes por registro, (por cada registro se guardan 4 fotos) para mostrar.

el problema es que cuando hago una consulta buscando cualquier palabra ingresada en el buscador, cuando la encuentra me muestra los 4 registros y no solo uno de los 4.

    $buscar = mysqli_query($conexion,"SELECT pub.codPublicacion, pub.tipoPublicacion,
    pub.fecPublicacion, pub.nomPublicacion, pubd.arcPubDet, pub.fecPublicacion, 
    SUBSTRING(pub.desPublicacion, 1, 50) AS mini  FROM publicacion AS pub   
    INNER JOIN publicaciondet AS pubd ON pub.codPublicacion = pubd.codPublicacion WHERE 
    pub.nomPublicacion LIKE '%".$busqueda."%' OR
    pub.desPublicacion LIKE '%".$busqueda."%' OR        
    pub.ubiPublicacion LIKE '%".$busqueda."%' OR
    pub.fecPublicacion LIKE '%".$busqueda."%' AND 
    pubd.arcPubDet LIKE 'f1%'
    ORDER BY pub.fecPublicacion DESC"); 

y con el ultimo LIKE lo que hago es definir que solo me traiga el nombre de la imagen que comience con "f1", la cual es la imagen principal pero aun asi me trae los 4 registros

introducir la descripción de la imagen aquí

espero su ayuda gracias!

3 Answers

Puedes incluir DISTINCT para asegurar que no hayan resultados repetidos (debido al detalle).

Ademas, para que la condiciones AND funcionen en conjunto con las OR, estas ultimas deben estar separadas del resto por paréntesis (solucionando esto adecuadamente, puede que nos ea necesario DISTINCT)

$buscar = mysqli_query($conexion,"SELECT DISTINCT pub.codPublicacion, pub.tipoPublicacion,
pub.fecPublicacion, pub.nomPublicacion, pubd.arcPubDet, pub.fecPublicacion, 
SUBSTRING(pub.desPublicacion, 1, 50) AS mini  FROM publicacion AS pub   
INNER JOIN publicaciondet AS pubd ON pub.codPublicacion = pubd.codPublicacion WHERE 
(pub.nomPublicacion LIKE '%".$busqueda."%' OR
 pub.desPublicacion LIKE '%".$busqueda."%' OR        
 pub.ubiPublicacion LIKE '%".$busqueda."%' OR
 pub.fecPublicacion LIKE '%".$busqueda."%') 
AND pubd.arcPubDet LIKE 'f1%'
ORDER BY pub.fecPublicacion DESC"); 

Correct answer by F.Igor on March 3, 2021

Creo que el problema esta cuando usas el or, ya que existe precedencia como en la suma y la multiplicación, para que no importa las condiciones or siempre te de el que comienza f1, agrupa de la siguiente forma.

$buscar = mysqli_query($conexion,"SELECT pub.codPublicacion, pub.tipoPublicacion,
pub.fecPublicacion, pub.nomPublicacion, pubd.arcPubDet, pub.fecPublicacion, 
SUBSTRING(pub.desPublicacion, 1, 50) AS mini  FROM publicacion AS pub   
INNER JOIN publicaciondet AS pubd ON pub.codPublicacion = pubd.codPublicacion WHERE 
(
  pub.nomPublicacion LIKE '%".$busqueda."%' OR
  pub.desPublicacion LIKE '%".$busqueda."%' OR        
  pub.ubiPublicacion LIKE '%".$busqueda."%' OR
  pub.fecPublicacion LIKE '%".$busqueda."%' 
)
AND 
pubd.arcPubDet LIKE 'f1%'
ORDER BY pub.fecPublicacion DESC"); 

Answered by Omar Alvarado on March 3, 2021

Puedes agregar limit 1 a la consulta... distinct también se podría usar, pero implica más trabajo de CPU que lo que necesitas.

Answered by eftshift0 on March 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP