es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta de Mysql para buscar publicaciones con título, contenido y etiqueta.

Requerimiento
– El orden del resultado de la consulta debe ser el siguiente:
resultado por título > resultado por contenido > resultado por etiqueta
– Cada resultado debe estar en el orden más reciente.

Quiero hacerlo en una sola consulta.
¿Cómo hacer una consulta eficiente?

Las siguientes son consultas que hice con REGEXP y FULLTEXT.

REGEXP

(SELECT * FROM board
    WHERE
        title rlike 'first' AND title rlike 'second'
    ORDER BY board_id DESC LIMIT 1000)
UNION
(SELECT * FROM board
    WHERE
        content rlike 'first' AND content rlike 'second'
    ORDER BY board_id DESC LIMIT 1000)
UNION
(SELECT * FROM board
    WHERE
        tag rlike 'first' AND tag rlike 'second'
    ORDER BY board_id DESC LIMIT 1000)
LIMIT 1000;

FULLTEXT

(SELECT * FROM board
    WHERE
        match(title) AGAINST('+"first" +"second"' in boolean mode)
    ORDER BY board_id DESC LIMIT 1000)
UNION
(SELECT * FROM board
    WHERE
        match(content) AGAINST('+"first" +"second"' in boolean mode)
    ORDER BY board_id DESC LIMIT 1000)
UNION
(SELECT * FROM board
    WHERE
        match(tag) AGAINST('+"first" +"second"' in boolean mode)
    ORDER BY board_id DESC LIMIT 1000)
LIMIT 1000;

Según lo que sé, REGEXP no utiliza un índice, pero es más rápido que fulltext.
No entiendo por qué sucede esto.

CREAR DECLARACIÓN

CREATE TABLE board (
  board_id bigint NOT NULL AUTO_INCREMENT,
  user_id bigint NOT NULL,
  nickname varchar(255) NOT NULL,
  category int NOT NULL,
  title varchar(255) NOT NULL,
  content text NOT NULL,
  likes int NOT NULL DEFAULT '0',
  hits int NOT NULL DEFAULT '0',
  tag varchar(255) DEFAULT NULL,
  create_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  modify_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (board_id),
  KEY popular (create_date,likes),
  FULLTEXT KEY fttitle (title),
  FULLTEXT KEY ftcontent (content),
  FULLTEXT KEY fttag (tag)
) ENGINE=InnoDB AUTO_INCREMENT=60027 DEFAULT CHARSET=utf8;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para realizar una consulta eficiente que cumpla con el requisito indicado, se puede utilizar una combinación de REGEXP y la cláusula ORDER BY.

    Aquí hay un ejemplo de consulta:

    SELECT *
    FROM board
    WHERE 
        (
            title RLIKE 'first' AND title RLIKE 'second'
        ) OR (
            content RLIKE 'first' AND content RLIKE 'second'
        ) OR (
            tag RLIKE 'first' AND tag RLIKE 'second'
        )
    ORDER BY
        (title RLIKE 'first' AND title RLIKE 'second') DESC,
        (content RLIKE 'first' AND content RLIKE 'second') DESC,
        (tag RLIKE 'first' AND tag RLIKE 'second') DESC,
        board_id DESC
    LIMIT 1000;
    

    Explicación:
    – La cláusula WHERE filtra los resultados en función de los términos de búsqueda en las columnas de título, contenido y etiqueta usando REGEXP.
    – La cláusula ORDER BY ordena los resultados según tres condiciones, cada una representando un término de búsqueda en título, contenido y etiqueta, respectivamente. La palabra clave DESC da prioridad al término de búsqueda que coincide con la columna de título, seguido de contenido y etiqueta.
    – Por último, ordenamos los resultados por board_id en orden descendente para obtener los últimos mensajes.

    Esta consulta utiliza el operador REGEXP junto con la cláusula ORDER BY para filtrar y ordenar eficientemente los resultados según los requisitos dados.

Comments are closed.