2015-04-23 16 views
0
组合搜索

我们当前的表结构从多个表

product_description [ 
    (INT)product_id, 
    (VARCHAR)name, 
    (TEXT)description, ... 
] 
vendors [ 
    (INT)vendor_id, 
    (VARCHAR)vendor_name, 
    (TEXT)vendor_description, ... 
] 
vendor [ 
    (INT)vendor, 
    (INT)product_id, ... 
] 

目前,我们有我们从两个表获取匹配值的搜索选项。它们独立工作,即使用LIKE的关键字搜索从表名和描述字段中获取匹配值。

现在需求已经被客户改变了。现在,客户希望搜索是依赖的,即假设有人搜索产品,那么他们的关联供应商应该被抓取,并且如果搜索供应商,则关联产品应该是可见的。但问题是没有选择来确定用户是否在搜索产品或供应商。

有什么办法可以使搜索依赖吗?

搜索后还有其他过滤器可用于制定位置,价格范围等。此外,结果显示在基于标签的页面上,供应商和产品的单独标签以及每个标签都有自己的分页,这些分页不会影响另一个标签。

我们建议客户在他们的搜索栏附近放下像elance一样的下拉列表,以便用户可以指定他们想要搜索的内容,但现在不可能更改设计。如何继续搜索?

+0

这种功能会搞乱的逻辑,并且可以是在壳体不会产生给用户的期望的结果。它很好的提供了另一种选择产品或供应商的选择。 –

+0

这是真的。但客户不想再修改设计,并且我无法找到任何逻辑来执行搜索。 – Sp0T

+0

最好和最简单的方法是使用两个不同的查询一个产品和一个供应商,因为您显示基于标签的结果,并且都有分页。所以这对于这样的需求是很好的解决方案 –

回答

0

经过一番说服,我们能够修改客户的要求以解决实施问题并在搜索时提供适当的价值。按照所提供的新的搜索指引,条件是:

  1. 如果<关键字> ==产品,然后显示产品标签上的产品,相关供应商,销售这些产品与<关键字>厂商匹配一起。

  2. 如果<关键字> == VENDOR,然后在VENDOR选项卡上显示VENDOR,并且只显示<关键字>产品匹配。

因此,基本上,供应商是相关的,而产品将是独立的。

QUERY用于产品 -

SELECT 
    p.product_id, 
    pd.product_type, 
    (SELECT AVG(rating) AS total FROM review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) 
     AS 
     rating, 
    (SELECT price FROM product_discount pd2 WHERE pd2.product_id = p.product_id AND pd2.customer_group_id = '1' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) 
     AS 
     discount, 
    (SELECT price FROM product_special ps WHERE ps.product_id = p.product_id AND ps.customer_group_id = '1' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) 
     AS 
     special 
FROM product p 
LEFT JOIN product_description pd 
    ON (p.product_id = pd.product_id) 
LEFT JOIN product_to_store p2s 
    ON (p.product_id = p2s.product_id) 
WHERE pd.language_id = '1' 
    AND p.status = '1' 
    AND p.date_available <= NOW() 
    AND p2s.store_id = '0' 
    AND (pd.name LIKE '%<KEYWORD>%' 
     OR 
     pd.description LIKE '%<KEYWORD>%' 
     OR 
     pd.tag LIKE '%<KEYWORD>%' 
     OR 
     LCASE(p.model) = '<KEYWORD>' 
     ) 
GROUP BY p.product_id 
ORDER BY p.image DESC, LCASE(pd.name) 
ASC 
LIMIT 0,15 

QUERY用于供应商独立

SELECT 
    DISTINCT (vds.vendor_id), 
    vds . * 
FROM vendors vds 
LEFT JOIN user u 
     ON (vds.user_id = u.user_id) 
LEFT JOIN vendor v 
     ON vds.vendor_id = v.vendor 
LEFT JOIN product_description pd 
     ON v.vproduct_id = pd.product_id 
LEFT JOIN product p 
     ON v.vproduct_id = p.product_id 
WHERE u.status = '1' 
     AND p.status = '1' 
     AND vds.display_vendor = '1' 
     AND (
      LOWER(vds.vendor_name) LIKE LOWER("%<KEYWORD>%") 
      OR 
      LOWER(vds.vendor_description) LIKE LOWER("%<KEYWORD>%") 
      OR 
      LOWER(pd.name) LIKE LOWER("%<KEYWORD>%") 
      OR 
      LOWER(pd.description) LIKE LOWER("%<KEYWORD>%") 
     ) 
ORDER BY vds.vendor_name 
ASC 
LIMIT 0 , 30