在竞争中使用CONCAT

时间:2014-03-06 16:32:17

标签: php mysql match match-against

我在搜索页面遇到问题。 我有一个我想搜索的产品列表

搜索必须包括:

  • 产品名称 - produse.produs
  • category - categorii.categorie
  • 变体名称 - variante.nume_varianta
  • 变体代码 - variante.nume_varianta

                    SELECT 
        produse.*, variante.*, categorii.categorie 
        FROM produse
        LEFT JOIN variante ON variante.id_produs=produse.id_produs
        LEFT JOIN categorii ON categorii.id_categorie=produse.id_categorie
        LEFT JOIN produse_valori ON produse_valori.id_produs=produse.id_produs
        WHERE MATCH (CONCAT_WS( produse.produs, variante.varianta_cod ,categorii.categorie, variante.nume_varianta))  AGAINST ( '.$keyword.' IN BOOLEAN MODE ) and produse.activ=1 
        GROUP BY produse.id_produs
    

但没有结果 我在phpMyAdmin中收到此错误:

#1064 - You have an error in your SQL syntax

1 个答案:

答案 0 :(得分:1)

  

我可以在比赛中使用concat sintax(就像我使用过的那样)吗?

不,你不能在MATCH()中使用CONCAT_WS()。只需命名列。

MATCH()的参数必须是FULLTEXT索引中的列。为索引定义的所有列,与索引中定义的顺序相同。

与任何索引一样,FULLTEXT索引只能包含一个表中的列。 MySQL中没有跨越多个表的索引。

如果要搜索多个表,则需要在每个表中使用FULLTEXT索引。并且每个表需要一个MATCH()。

SELECT 
produse.*, variante.*, categorii.categorie 
FROM produse
LEFT JOIN variante ON variante.id_produs=produse.id_produs
LEFT JOIN categorii ON categorii.id_categorie=produse.id_categorie
LEFT JOIN produse_valori ON produse_valori.id_produs=produse.id_produs
WHERE
produse.activ=1 
AND (
    MATCH(produse.produs) AGAINST('.$keyword.' IN BOOLEAN MODE) 
    OR MATCH(variante.varianta_cod, variante.nume_varianta) AGAINST('.$keyword.' IN BOOLEAN MODE) 
    OR MATCH(categorii.categorie) AGAINST('.$keyword.' IN BOOLEAN MODE) 
)
GROUP BY produse.id_produs

如果您需要跨表的全文索引,则必须使用其他全文索引工具,如Sphinx SearchApache Solr。这些工具可以索引任何SELECT查询的结果,包括带有连接的查询。