2010-08-13 4 views
4

J'espère vraiment que quelqu'un peut m'aider avec mon problème. Je voudrais réaliser une correspondance avec query avec group_concat.Utiliser concat dans la clause MATCH AGAINST - mysql

je besoin de quelque chose comme ceci:

Select c.id, p.place 
    from content c 
    join place p on p.object_id = c.id 
where match(group_concat(p.place)) AGAINST('"string1" "string2" "string3"', IN BOOLEAN MODE) 
    and not match (group_concat(p.place)) AGAINST('string4', IN BOOLEAN MODE) 

J'ai essayé d'utiliser la clause ayant également, mais ne fonctionne pas.

En ce moment, je n'ai aucune idée de comment je peux résoudre ce problème. Quelqu'un pourrait-il m'aider à résoudre ce problème? Merci beaucoup.

+1

+1: alias de table, se joint .. Quel soulagement bienvenu à ce que je vois généralement sur SO. –

Répondre

3

Vous ne pourrez pas utiliser GROUP_CONCAT dans une clause WHERE - les fonctions d'agrégat ne peuvent être utilisées que dans la clause HAVING. Mais vous pouvez utiliser une table dérivée/vue en ligne pour obtenir cette sortie GROUP_CONCAT, comme ceci:

SELECT c.id, 
     x.place 
    FROM CONTENT c 
    JOIN (SELECT p.object_id, 
       p.place, 
       GROUP_CONCAT(p.place) AS grp_place 
      FROM PLACE p 
     GROUP BY p.object_id) x ON x.object_id = c.id 
WHERE MATCH(x.grp_place) AGAINST('"string1" "string2" "string3"', IN BOOLEAN MODE) 
    AND NOT MATCH(x.grp_place AGAINST('string4', IN BOOLEAN MODE) 

MySQL permet des colonnes "cachées" dans le GROUP BY: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

+0

J'ai essayé ceci, mais j'ai reçu une erreur: "Le type de table utilisé ne supporte pas les index FULLTEXT". Ma table principale a un index FULLTEXT, l'erreur était sur x.grp_place dans ce cas (si je remplace MATCH AGAINST avec LOCATE cela fonctionne!). Une idée sur la façon de résoudre ce problème? – patrick

Questions connexes