【问题标题】:Join 2 identical tables to perform a textfull search in MYSQL加入 2 个相同的表以在 MYSQL 中执行文本搜索
【发布时间】:2014-06-21 14:10:37
【问题描述】:

我有 2 个完全一样的表:table1 和 table2,我需要执行相关的 table1,现在我正在使用 table1 进行以下查询。

    select SQL_CALC_FOUND_ROWS
                table1.slug as slugpost,
                table1.titulo,
                table1.id,
                table1.id_usu,
                table1.id_cat,
                table1.slug,
                table1.fecha,
                table1.html,
                table1.hit,
                table1.etiquetas,
                table1.status as table1tatus,
                categorias.nombre,
                categorias.slug as slugcategoria,
                categorias.icon,
                usuarios.id as idusuarios,
                usuarios.usuario
                    from table1 
                        LEFT JOIN usuarios
                            on table1.id_usu = usuarios.id
                        LEFT JOIN categorias on categorias.id=table1.id_cat
                        WHERE
                    MATCH(titulo, etiquetas, html) AGAINST ('".$query."')
                    limit 1,5;

查询工作正常,但如您所见,只需在 table1 上搜索即可。

Table1 保留我网站上的旧 table1(从 0 到 127000),table2 是新帖子的新表(从 127001 开始)。

编辑 我尝试使用 UNION 但我无法使其工作,MYSQL 说 找不到与列列表匹配的 FULLTEXT 索引。

SELECT SQL_CALC_FOUND_ROWS
                    t.slug as slugpost,
                    t.titulo,
                    t.id,
                    t.id_usu,
                    t.id_cat,
                    t.fecha,
                    t.html,
                    t.hit,
                    t.etiquetas,
                    t.status as table1tatus,
                    categorias.nombre,
                    categorias.slug as slugcategoria,
                    categorias.icon,
                    usuarios.id as idusuarios,
                    usuarios.usuario
FROM
(
SELECT table1.slug,table1.titulo,table1.id,table1.id_usu,table1.id_cat,table1.fecha,table1.html,table1.hit,table1.etiquetas,table1.status FROM table1
UNION
SELECT table2.slug,table2.titulo,table2.id,table2.id_usu,table2.id_cat,table2.fecha,table2.html,table2.hit,table2.etiquetas,table2.status FROM table2
) t
 LEFT JOIN usuarios on t.id_usu = usuarios.id
 LEFT JOIN categorias on categorias.id=t.id_cat
 WHERE
   MATCH(titulo, etiquetas, html) AGAINST ('dvdrip latino')
   limit 1,5;

我也运行了以下命令

 ALTER TABLE `table1` ADD FULLTEXT INDEX `test` (`title`, `tags`, `html`); 
 ALTER TABLE `table1` ADD FULLTEXT INDEX `test2` (`title`, `tags`, `html`); 

【问题讨论】:

    标签: mysql sql-server


    【解决方案1】:

    你可以这样做,通过在子选择中组合你的表

    SELECT 
    t.slug as slugpost
    ,...
    FROM
    (
    SELECT * FROM table1 
    UNION
    SELECT * FROM table2 
    ) t
     LEFT JOIN usuarios on t.id_usu = usuarios.id
     LEFT JOIN categorias on categorias.id=t.id_cat
     WHERE ...
    

    要使用全文搜索,您应该为两个表的列添加全文索引

    ALTER TABLE `table1` ADD FULLTEXT INDEX `test` (`titulo`, `etiquetas`, `html`); 
    ALTER TABLE `table1` ADD FULLTEXT INDEX `test2` (`titulo`, `etiquetas`, `html`); 
    

    另一种使用全文索引的方法,您可以编写联合查询,如下所示,为子选择中的每个查询单独使用MATCH()

    SELECT SQL_CALC_FOUND_ROWS
    t.slug as slugpost,
    t.titulo,
    t.id,
    t.id_usu,
    t.id_cat,
    t.fecha,
    t.html,
    t.hit,
    t.etiquetas,
    t.status as table1tatus,
    categorias.nombre,
    categorias.slug as slugcategoria,
    categorias.icon,
    usuarios.id as idusuarios,
    usuarios.usuario
    FROM
    (
    SELECT table1.slug,table1.titulo,table1.id,table1.id_usu,table1.id_cat,table1.fecha,table1.html,table1.hit,table1.etiquetas,table1.status FROM table1
    WHERE MATCH(`title`, `tags`, `html`) AGAINST ('dvdrip latino')
    UNION
    SELECT table2.slug,table2.titulo,table2.id,table2.id_usu,table2.id_cat,table2.fecha,table2.html,table2.hit,table2.etiquetas,table2.status FROM table2
    WHERE MATCH(`title`, `tags`, `html`) AGAINST ('dvdrip latino')
    ) t
    LEFT JOIN usuarios on t.id_usu = usuarios.id
    LEFT JOIN categorias on categorias.id=t.id_cat
    limit 1,5;
    

    MATCH() 列列表必须与某些列列表完全匹配 表的 FULLTEXT 索引定义,除非此 MATCH() 为 IN 布尔模式。布尔模式搜索可以在非索引列上进行, 尽管它们可能很慢。

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-restrictions.html

    【讨论】:

    • 嗨,感谢您的评论,我已经尝试过 tny.cz/b8c5ab34 但 MYSQL 说:#1191 - 找不到与列列表匹配的 FULLTEXT 索引。当我尝试这个tny.cz/17868255 时说重复的列名'slug'。提前致谢
    • 谢谢,选择 slug 两次是我的错误,我正在更新我的答案以及我尝试过的建议,但 MYSQL 仍然显示 #1191 - 找不到与列列表匹配的 FULLTEXT 索引。
    • @josesanchez 你确定你的表类型是MyISAM 吗?
    • @jossanchez 看到我更新的答案希望它运作良好
    • 它有效,谢谢!.. 还有一件事,该查询很慢,加载需要 3 秒。
    【解决方案2】:

    您确实在选择列表中将slug 列添加了两次,而这在子查询中是不允许的。删除一个事件:

    FROM
    (
    SELECT table1.slug,table1.titulo,table1.id,table1.id_usu,table1.id_cat,table1.fecha,table1.html,table1.hit,table1.etiquetas,table1.status FROM table1
    UNION
    SELECT table2.slug,table2.titulo,table2.id,table2.id_usu,table2.id_cat,table2.fecha,table2.html,table2.hit,table2.etiquetas,table2.status FROM table2
    ) t
    

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2013-05-08
      相关资源
      最近更新 更多