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

标签 php sql

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

因此每个图像可以有许多与其关联的标签。我如何有效且可缩放地选择 1 个图像并找到下一个最相似的 x 个图像(具有与其关联的相同标签)

所有操作均使用 javascript、ajax 和 php 在网络上完成。感谢您提供有关如何解决此问题的任何建议和提示!

编辑:

是Mysql

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

IMAGEID、TAGID为主键

所以,是的,有一个 IMAGEIDS 和 TAGIDS 的标准化索引来节省空间。

我试图确定,如果图像 A 与图像 B 的 10 个标签中有 10 个相同,则返回的值将高于图像 C,而图像 C 的 10 个标签中有 6 个相同。

很抱歉含糊不清。我正在开发该网站,因此如果无法用我所拥有的来做到这一点,我可以添加键、外键等。而且它不必在一个巨大的 SQL 语句中完成,我只是不想通过一次将我的第一行与每隔一行 1 进行比较而陷入 o(n^2) 的情况。

最佳答案

不幸的是,这种设计实际上并不是非常可扩展。原因很简单,因为您确实会将一张图像的标签与几乎所有其他图像的标签进行比较。

它是可编码的,只是不可过度扩展。 (数百张图像?太棒了!数万张?您将能够测量查找速度。)

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)

关于php - 如何有效地将 1 行与数据库中的所有其他行进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10354733/

相关文章:

PHP MYSQL 显示带评论的帖子

javascript - 使用 Facebook 用户名获取 Facebook 个人资料图片

mysql - 理清子查询

sql - 为什么我的 SQL UNION 不工作?

java - 在 java 中使用准备好的语句插入到自定义 SQL 类型中

php - Android应用内购买服务器签名验证使用php OpenSSL

php - 使用函数通过 mysql 检索数据并在选择框中使用?

php - 在一个查询中在 MySQL 中执行插入/更新的最佳方法是什么?

mysql - 如何使用查询删除数据库中某个单词后的文本?

php - 根据 id 匹配使用另一个表中的值更新一个 MySQL 表