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
espero su ayuda gracias!
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP