php - 相关产品 SQL 查询

标签 php mysql sql pdo sql-like

我正在尝试在我的网站上展示与相关产品类似的内容。我测试了以下查询,没有收到任何错误;但我也没有得到任何结果。

<?php 
    $relatedStmt = $db->query("SELECT * FROM items WHERE tag LIKE id = 1 LIMIT 3");
?>

我还尝试了%1%,它显示了所有结果,我假设代码认为查询只是SELECT * FROM items

该列中的标签按以下格式显示:tagone 二三四,所以我试图显示具有相似标签的产品,这就是为什么我使用 LIKE 子句。

Table screenshot

当前查询与此查询相关:SELECT * FROM items WHERE id = 1。所以LIKE id = 1就是找到与这个查询匹配的标签来展示相关的产品。

最佳答案

LIKE不按您预期的方式工作。它是用于在操作数之间使用通配符进行字符比较的字符。

在 mysql 函数中,最接近您想要的可能是 LOCATEFIND_IN_SET 。其他问题也有不同的解决方案,例如 "Can Mysql Split a column?""Split a MYSQL string from GROUP_CONCAT into an ( array, like, expression, list) that IN () can understand" 。然而,即便如此,也没有什么好的方法可以将连接的 tag 列中的各个标记与表中其他行的各个标记进行比较。

因此,我认为您最好将标签移动到自己的表中,并使用 item_id 作为外键。那么解决方案就是trivial (SQLFiddle) :

-- Related Items
SELECT *
  FROM items
 WHERE id in (SELECT DISTINCT item_id
                FROM tags t
                JOIN (SELECT tag
                        FROM tags
                       WHERE item_id = 1
                      ) t1 ON t1.tag = t.tag
               WHERE item_id != 1
              )
;

关于php - 相关产品 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341727/

相关文章:

php - 代码点火器 : Unable to load the requested file:

php - 从数据库中获取所有行,其中 id=$id in codeigniter

PHP 和 Node.js 还是只有 Node.js?

php - MYSQL JOIN所有子行,父行只显示一次

sql - 如何编写 SQL Server 登录密码更改脚本?

MySQL连接不同的表

php - 有谁知道一个好的框架或应用程序可以快速构建基于 MySQL 和 PHP 的 Web 应用程序的前端?

php - 使用 Propel 连接的名称属性

php - 在 Zend_db_select 中更改表名

sql - 使用 MS Access 中的 SQL 查询返回组内最常见的值和计数