我一直在努力寻找格式化我的mysql表达式以匹配相关关键字表的正确方法。
表格设置如下:
photos: id,path,various exif data
photos_to_tags: photos_id,photos_tags_id
photo_tags: id,name
SQL如下:
SELECT DISTINCT (photos.path),photos.name,
MATCH (photo_tags.name) AGAINST('+bamboo* +flooring* ') AS relevance
FROM photo_tags
LEFT JOIN photos_to_tags ON photo_tags_id = photo_tags.id
LEFT JOIN photos ON photos.id = photos_id
WHERE (MATCH (photo_tags.name) AGAINST('+bamboo* +flooring* ' IN BOOLEAN MODE))
OR photo_tags.name = 'bamboo flooring'
GROUP BY path
ORDER BY relevance
LIMIT 0,24;
除非确切的短语"竹地板"否则它不会返回结果。是一个标签。如果' bamboo'是一个标签,'地板'是一个标签,然后它不会返回结果。
进一步阐述问题的详细说明:这是针对承包商的网站。他有数百张照片。他可能有30张屋顶照片,其中一些屋顶照片可能是钢屋顶,其他可能是雪松摇晃,寿命等等。
关键字标签位于单独的表格中,它们可用于列出所有屋顶照片,或者搜索可用于进一步隔离钢屋顶,或者可能使用带有装饰细节的钢屋顶等。
可能有另一种方式来编写此查询 - 我无法找到返回相关结果的好方法。例如,如果有人搜索终身屋顶,他们就不想看到钢屋顶照片。
谢谢!
答案 0 :(得分:0)
"除非确切的短语"竹地板"否则它不会返回结果。是一个标签" -
是的,它不会返回,因为你写的' +'(这意味着它必须存在)在两者面前。读 Mysql Devsite了解它是如何运作的。
你也可以这样写:对于没有'竹子的照片。标签不会返回任何结果。
SELECT DISTINCT (photos.path),photos.name, FROM photo_tags
INNER JOIN photos_to_tags ON photo_tags_id = photo_tags.id INNER JOIN
photos ONphotos.id=photos_id WHERE photo_tags.name LIKE '%bamboo%' // 'bamboo' tag should be there or the search text..
GROUP BY path , photos.name
LIMIT 0,24;