【问题标题】:Related Products SQL Query相关产品 SQL 查询
【发布时间】:2014-06-21 12:43:46
【问题描述】:

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

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

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

列中的标签以以下格式显示:tagone two three four,所以我试图显示具有相似标签的产品,因此我使用了LIKE 子句。

Table screenshot

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

【问题讨论】:

  • 你能给我们看一张桌子的样本吗?
  • 将LIKE 视为CONTAINS - WHERE tag LIKE "%red%" will find all rows where the tag *contains* the string red`
  • @ncdreamy 我已经用表格截图更新了问题。
  • 好的,那么您要从该表中提取什么?查看表格时,您的查询毫无意义。
  • 在这种情况下,您可以简单地执行SELECT * FROM items WHERE tag = (select tag from items where id = 1),但这与说SELECT * FROM items WHERE id = 1 相同。我真的对你的问题感到困惑。

标签: php mysql sql pdo sql-like


【解决方案1】:

LIKE 无法按照您的预期工作。它是用于字符比较的字符,带有通配符,在操作数之间。

在 mysql 函数中,最接近您想要的可能是 LOCATE 或 FIND_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
              )
;

【讨论】:

    【解决方案2】:

    我不确定您查询中的 id = 1 内容,但无论如何您都可以尝试:SELECT * FROM items WHERE tag LIKE '%search_this_tag%' LIMIT 3

    【讨论】:

    • 请注意,如果没有 ORDER BY,LIMIT 几乎毫无意义
    • 我不想搜索确切的标签。我想将标签与 id=1 行匹配。
    • @Strawberry 谢谢,我会改变的。
    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多