如果任何组合匹配,MySQL将显示结果

如果任何组合匹配,MySQL将显示结果,mysql,sql,Mysql,Sql,假设用户有一个搜索表单,在其中搜索属性。假设他选择: Location : ABC Price Range : 1 million - 5 millions No. of Bedrooms Range : 5 - 12 State : XYZ County : PQR Category: MNO 匹配他选择的所有字段以从数据库生成结果的可能性非常小。所以在这里使用和在条件似乎不有效的地方。我想要的是- 如果所有选择都匹配,则没有问题显示结果 如果位置、价格范围、状态匹配,则也显示结果 如果位置、

假设用户有一个搜索表单,在其中搜索属性。假设他选择:

Location : ABC Price Range : 1 million - 5 millions No. of Bedrooms Range : 5 - 12 State : XYZ County : PQR Category: MNO 匹配他选择的所有字段以从数据库生成结果的可能性非常小。所以在这里使用和在条件似乎不有效的地方。我想要的是-

如果所有选择都匹配,则没有问题显示结果 如果位置、价格范围、状态匹配,则也显示结果 如果位置、卧室数量、类别、状态匹配,则也显示结果 以此类推……如果任何组合匹配,则显示结果
您可能希望在WHERE子句中设置许多条件

WHERE (Location AND price AND Bedrooms AND State AND County AND Category)
OR (Location AND Price AND State)
OR (Location AND Bedrooms AND Category AND State)
OR (...)
...

这允许任何您希望有效的数据组合返回数据。

您希望在WHERE子句中设置许多条件

WHERE (Location AND price AND Bedrooms AND State AND County AND Category)
OR (Location AND Price AND State)
OR (Location AND Bedrooms AND Category AND State)
OR (...)
...

这允许任何您希望有效的数据组合返回数据。

如何筛选表中与任何搜索项匹配的记录,并按匹配项的数量降序排列结果:

SELECT   *,
         (Location = 'ABC')
       + (Price BETWEEN 1000000 AND 5000000)
       + (Bedrooms BETWEEN 5 AND 12)
       + (State = 'XYZ')
       + (County = 'PQR')
       + (Category = 'MNO')
           AS relevance
FROM     my_table
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')
HAVING   relevance >= ?   -- specify the minimum number of matching terms here
ORDER BY relevance DESC
LIMIT    ?                -- specify the maximum number of matching records here

如何筛选表中与任何搜索项匹配的记录,并按匹配项的数量降序排列结果:

SELECT   *,
         (Location = 'ABC')
       + (Price BETWEEN 1000000 AND 5000000)
       + (Bedrooms BETWEEN 5 AND 12)
       + (State = 'XYZ')
       + (County = 'PQR')
       + (Category = 'MNO')
           AS relevance
FROM     my_table
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')
HAVING   relevance >= ?   -- specify the minimum number of matching terms here
ORDER BY relevance DESC
LIMIT    ?                -- specify the maximum number of matching records here

类似于eggyals的解决方案,但只是为了恢复您关心的行。未测试,请原谅任何打字错误:-

SELECT Sub2.*
FROM (SELECT MAX(
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END) AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO'))Sub1
INNER JOIN (SELECT a.*,
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')) Sub2
ON Sub1.MatchCount = Sub2.MatchCount

类似于eggyals的解决方案,但只是为了恢复您关心的行。未测试,请原谅任何打字错误:-

SELECT Sub2.*
FROM (SELECT MAX(
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END) AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO'))Sub1
INNER JOIN (SELECT a.*,
CASE WHEN Location = 'ABC' THEN 1 ELSE 0 END +
CASE WHEN Price BETWEEN 1000000 AND 5000000 THEN 1 ELSE 0 END +
CASE WHEN Bedrooms BETWEEN 5 AND 12 THEN 1 ELSE 0 END +
CASE WHEN State = 'XYZ' THEN 1 ELSE 0 END +
CASE WHEN County = 'PQR' THEN 1 ELSE 0 END +
CASE WHEN Category = 'MNO' THEN 1 ELSE 0 END AS MatchCount
FROM     my_table a
WHERE    (Location = 'ABC')
      OR (Price BETWEEN 1000000 AND 5000000)
      OR (Bedrooms BETWEEN 5 AND 12)
      OR (State = 'XYZ')
      OR (County = 'PQR')
      OR (Category = 'MNO')) Sub2
ON Sub1.MatchCount = Sub2.MatchCount

我试过这个,它几乎产生了所有的记录。总共大约有883条记录,查询返回了858条记录,这看起来很不错irrelevant@Sharmila:您可以添加HAVING子句,将结果限制为仅匹配n个以上项的结果,和/或添加LIMIT子句,将结果限制为最佳n个匹配项。更易于阅读和维护,总的来说,比其他答案要干净得多,你得到了我的选票@eggyal,谢谢你的帮助。但它仍然不起作用,无论我在搜索表单中选择什么,它只给出相同的14个结果。我尝试了这个,它几乎产生了所有记录。总共大约有883条记录,查询返回了858条记录,这看起来很不错irrelevant@Sharmila:您可以添加HAVING子句,将结果限制为仅匹配n个以上项的结果,和/或添加LIMIT子句,将结果限制为最佳n个匹配项。更易于阅读和维护,总的来说,比其他答案要干净得多,你得到了我的选票@eggyal,谢谢你的帮助。但它仍然不起作用,无论我在搜索表单中选择什么,它只会给出相同的14个结果