【问题标题】:product search across 3 database tables跨 3 个数据库表的产品搜索
【发布时间】:2023-03-10 21:06:01
【问题描述】:

我正在尝试在我正在构建的电子商务网站上创建产品搜索功能,但遇到了一些麻烦。

我有 3 个表(类别、子类别、产品)

类别表字段:(categoryID, categoryName, active, image)

sub_categories 表字段:(categoryID, categoryName, parentCatID, active, image)

产品表字段:(productID、shortDescription、longDescription、image、catID、subCatID、active、price、delivery、weight)

如果用户键入简短描述或详细描述的任何部分,或者如果用户键入类别或子类别名称的任何部分,我试图让我的搜索找到产品,它应该找到这些类别中的所有产品.

我不知道是执行 JOIN 查询还是执行多个 SQL 查询。老实说,我已经修补了几个小时,但还没有真正到达任何地方,现在又回到绘图板上寻求帮助

我的第一次尝试是这样的:

 $catSelect = mysqli_query($con,"SELECT * FROM categories WHERE categoryName LIKE '%{$term}%'"); 
            $row1 = mysqli_fetch_row($catSelect);
 $subCatSelect = mysqli_query($con,"SELECT * FROM sub_categories WHERE categoryName LIKE '%{$term}%' OR parentCatID = '%{$row1[0]}%'");
            $row2 = mysqli_fetch_row($subcatSelect);
            $productSelect = mysqli_query($con,"SELECT * FROM products WHERE short_description LIKE '%{$term}%' OR long_description LIKE '%{$term}%' OR subCatID = '%{$row2[0]}%' OR catID = '%{$row1[0]}%'"); 

我的最后一次尝试是这样的

mysqli_query($con,"SELECT * FROM products  INNER JOIN categories ON products.catID = categories.categoryID WHERE categories.categoryName LIKE '%{$term}%'") or die(mysqli_error());

有人可以帮我处理我需要使用的 SQL 查询吗?

【问题讨论】:

  • 您的查询尝试(即使错误)将帮助每个人了解您当前的 SQL 技能水平并相应地提出解决方案。此外,您付出的努力越多,您收到的答案就越好
  • 好的,编辑以适应您的建议(彻底使用撤消按钮)

标签: php html mysql search


【解决方案1】:

试试这个:

SELECT
    p.productID
FROM
    products p
LEFT JOIN categories c
    ON c.categoryID = p.catID
LEFT JOIN sub_categories sc
    ON sc.categoryID = p.subCatID
WHERE
    p.shortDescription LIKE '%keyword%'
    OR p.longDescription LIKE '%keyword%'
    OR c.categoryName LIKE '%keyword%'
    OR sc.categoryName LIKE '%keyword%'

【讨论】:

  • 我只是自己写了准确的陈述,你也打败了我。在你的答案弹出之前,我已经到了 WHERE 子句!无论如何@Kevlar一旦你有这个工作,我建议看一个mysql全文搜索,它们有点难以理解,但是在进行这种搜索时是LIKE的更好选择(即更快并且有点忽略常用词例如音乐艺术家搜索中的“The Beatles”和“Beatles”会与那些 LIKE 不同,但全文会忽略“THE”)
  • @Lee 关于FULLTEXT 搜索的好建议 :)
  • 我一定会调查的..我现在有点赶时间,我的能力意味着我现在必须保持简单
  • @Kevlar :当您有多个表名时,使用表别名是很常见的。因此,您不必每次想从 products 表中指定一个列时都键入“products.column_name”,而只需使用 P 的别名。您可以在 FROM 子句中看到它说FROM products p(我通常会写FROM products AS p但“as”是可选的)。您可以为表、列、数据库等创建别名。在大多数情况下,我们使用它们是因为我们很懒,而且多次输入 p 比输入 products 更快(这完全没问题且合法),它们也有非懒惰的用途
  • @Kevlar 不幸的是 Stackoverflows 的评论文本限制,这意味着我无法像我希望的那样解释别名,但是如果您需要有关别名的任何进一步信息,这里有一些基本的列和表别名信息可在此处的 w3schools 获得:w3schools.com/sql/sql_alias.asp
【解决方案2】:

您需要在所有三个表上进行连接,并使用 where 子句查询您要搜索的字段。像这样的:

select * from 
products
inner join categories on products.catID = categories.categoryID
inner join sub_categories on products.subCatID = sub_categories.categoryID
where
products.shortDescription like '%query%'
or products.longDescription like '%query%'
or categories.categoryName like '%query%'
or sub_categories.categoryName like '%query%'
;

query 是搜索查询字符串。

【讨论】:

    【解决方案3】:

    这对你有帮助.....

    SELECT * FROM products AS  PT 
    LEFT JOIN Categories AS CT ON CT.catID = PT.catID
    LEFT JOIN sub_categories  AS SCT ON SCT.subCatID = PT.subCatID
    WHERE 
      PT.active = 'YES' AND 
      (PT.shortDescription LIKE '%shortDescription%' OR 
       PT.longDescription LIKE '%longDescription%' OR 
       CT.category LIKE '%category%'  OR 
       SCT.categoryID LIKE '%sub category%' )
    

    您只需使用 php varrible 输入您的值,您就可以获得搜索结果。

    【讨论】:

    • 缩进,缩进,缩进。
    【解决方案4】:

    你为什么不为此使用 lucene-solr?

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 2013-06-03
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      相关资源
      最近更新 更多