您如何有效地将1行与数据库中的所有其他行进行比较

时间:2012-04-27 16:49:27

标签: php sql

我有一个主要有3个表的数据库,(ImageID,imageName),(ImageID | Tags)和(tagID,tagName)

因此每个图像都可以有许多与之关联的标签。我将如何有效和可扩展地选择1个图像并找到最相似的下一个x图像(具有相同的标签)

所有使用javascript,ajax和php在网上完成。感谢您提供有关如何处理此问题的任何建议和提示!

编辑:

是Mysql

格式为(表)和(ROW | ROW)

IMAGEID,TAGID是主键

所以是的,有一个标准化的IMAGEIDS和TAGIDS指数可以节省空间。

如果图像A与图像B共有10个标签中的10个,我会尝试获得高于图像C的图像,其中共有10个标签中的6个。

抱歉模糊不清。我正在开发网站,所以我可以添加密钥,外键等,如果它不可能用我所拥有的。并且它不必在一个巨大的SQL语句中完成,我只是不想通过一次比较我的第一行和每隔一行1来进入o(n ^ 2)情况。

2 个答案:

答案 0 :(得分:2)

不幸的是,这种设计实际上并不具备可扩展性。仅仅因为你真的要将一个图像的标签与几乎所有其他图像的标签进行比较。

它是可编码的,它只是没有过度扩展。 (100的图像?太棒了!成千上万?你将能够测量查找速度。)

SELECT
  allImage.ImageID,
  COUNT(*)           AS commonTags
FROM
  image_tag    AS allImage
INNER JOIN
  image_tag    AS myImage
    ON allImage.TagID = myImage.TagID
WHERE
  myImage.ImageID = 123
GROUP BY
  allImage.ImageID
ORDER BY
  COUNT(*) DESC

然后使用LIMIT或TOP(取决于您的SQL风格)仅选择第一个(N)图像。

注意:这假设您没有在一行的一个字段中保存的字符串中的图像的所有标记。如果你这样做,你真的应该规范化数据,每行有一个(ImageID,TagID)

答案 1 :(得分:1)

我会在前两个表中创建一个ImageID索引来提高速度。然后使用简单的SELECT WHERE查询。