我目前正在为摄影师制作网站,每张照片都标有多个关键字,这些关键字在上传时会被提取。
我的数据库看起来像这样(简化)
TAGS
-------------------
| | |
| | |
| ID | TAG |
| | |
| | |
-------------------
IMAGES
-------------------
| | |
| | |
| ID | URL |
| | |
| | |
-------------------
TAGS_IMAGES
-------------------
| | |
| TAG | IMAGE |
| ID | ID |
| | |
| | |
-------------------
所以所有标签都存储在一个单独的表中以防止重复,图像也是如此,然后标签和图像在另一个表中链接在一起。
在搜索标签时,我执行此SQL以查找基于给定标签的所有图像
SELECT DISTINCT SQL_CALC_FOUND_ROWS tags.tag, tags_image.imageID, images.src FROM tags INNER JOIN tags_image ON tags.tagID = tags_image.tagID INNER JOIN images ON tags_image.imageID = images.id WHERE tag LIKE ? ORDER BY id DESC LIMIT ?, ?
但问题是我仍然得到多个副本,因为DISTINCT似乎只对tag.id起作用。
正如你在这里看到的那样:http://pastebin.com/MWt5B0Aq,根据标签“water”,一些图像有“water”,“watervogel”,“waterloop”等关键字。
有没有办法让DISTINCT在images.id上工作?
我尝试了这个,但这没有帮助
SELECT DISTINCT images.id SQL_CALC_FOUND_ROWS tags.tag, tags_image.imageID, images.src FROM tags INNER JOIN tags_image ON tags.tagID = tags_image.tagID INNER JOIN images ON tags_image.imageID = images.id WHERE tag LIKE ? ORDER BY id DESC LIMIT ?, ?
答案 0 :(得分:1)
通过帮助做一组?
SELECT DISTINCT SQL_CALC_FOUND_ROWS tags.tag, tags_image.imageID, images.src FROM tags INNER JOIN tags_image ON tags.tagID = tags_image.tagID INNER JOIN images ON tags_image.imageID = images.id WHERE tag LIKE ? GROUP BY images.id ORDER BY id DESC LIMIT ?, ?