MySQL - Ayuda con consulta

 
Vista:

Ayuda con consulta

Publicado por Jorge (1 intervención) el 29/11/2022 10:52:37
Buenos días, no logro que esta consulta funcione como quiero:

1
SELECT id,name,url,images_url,stock,status,blackfriday,iva_st,rec_eq_st,categories,pvd,pvr,benefit_st,benefit,discount,discount_amount,discount_percent FROM `products` where stock>0 AND pvr>0 AND available=0 AND MATCH (categories) AGAINST ( '2651' ) OR MATCH (categories) AGAINST ( '2452' ) OR MATCH (categories) AGAINST ( '2429' ) LIMIT 50

"stock>0" pvr>0 y available=0 no se están cumpliendo ya que me arroja resultados con stock en 0 pvr en 0 y available no igual a 0.

Con la búsqueda fulltext lo que pretendo conseguir es que entre esos 50 resultados me devuelva aleatoriamente productos de las categorías 2651, 2452 y 2429

A las consultas fulltext les puse OR en vez de AND por que ningun producto contiene esas tres categorías juntas.

Los productos tienen una columna llamada "categories" en la que se almacenan las categorías separadas por comas a las que pertenece el producto. "1548,4587,9854,1254"

Con esta consulta no termina de funcionar bien y no se como hacerlo, alguien podría ayudarme?

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Manuel
Val: 19
Ha aumentado 1 puesto en MySQL (en relación al último mes)
Gráfica de MySQL

Ayuda con consulta

Publicado por Manuel (10 intervenciones) el 29/11/2022 13:18:06
Hola, no se si te entiendo del todo bien, pero por ejemplo, yo no se como no simplificas y en lugar de:
AND MATCH (categories) AGAINST ( '2651' )
OR MATCH (categories) AGAINST ( '2452' )
OR MATCH (categories) AGAINST ( '2429' )
Que cuidado con la precedencia de operadores entre los AND y los OR, siempre que los combines, con paréntesis y más cuando el AND tiene precedencia al OR...

Pero después, precisamente an las partes OR es que no entiendo porque no vas a lo simple y en lugar pones algo como:
AND categories in ('2651','2452','2429')

y ya no necesitas los OR, la consulta es más rápida (tanto menor consumo de ciclos de CPU como cantidad de memoria). Aunque si realmente ese campo es un texto donde puede haber los 3 valores, alguno o ninguno separado por ",", luego si sería como pones, pero cuiado con los OR, pon paréntesis. Es que esto último es lo que no me queda claro de entenderte bien. Aunque también te digo una cosa, es cierto que usar Like, menos en casos concretos, pues es más costoso en recursos y por tanto más lento... es cierto pero con matices: empezando porque solo cuando hay muchos más de unos 10 o 15K registros (si tu cantidad de registros contra los que se hace la búsqueda es de pocos miles, realmente like no tiene ese sobrecoste e incluso puede ser más rápido) o si es una columna indexada, en cuyo caso también es más eficiente, aunque digan lo contrario, con Like. Y, en MySQL tiene RLike (basicamente Like permitiendo expresiones más complejas), también está REGEX. Y con esto último hacer algo así:
categories REGEXP '2651|2452|2429', con un poco uso extra de comodines.

Para que los registros que devuelva sean aleatorios, yo las veces que lo necesité o me convenía, lo hacía con:
ORDER BY RAND() en MySQL.
Por cierto, por si alguien busca hacer lo mismo con SQL Server y llega a este comentario, pues en SQL Server sería casi igual, pero en lugar de RAND() sería NEWID().
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar