用于确定公司名称优先级的SQL

时间:2018-02-26 06:36:37

标签: mysql sql

我有一个名为

的表

过滤

page    companyA      companyB   companyC     filterA   filterB
page1   Google        Microsoft  Apple        hardware  web
page2   Oracle        Microsoft  Lenovo       database  web

公司

company      hardware     web        database
Google       YES          YES        YES
Sony         YES          YES        NO           
Oracle       NO           YES        YES
Apple        YES          YES        NO
Lenovo       YES          NO         YES
Microsoft    YES          YES        YES

我需要根据过滤器中的过滤条件显示表公司中的公司列表。

对于filter的第一行,对于page1,我有以下变量:

filterA = hardware
filterB = web

filterA和filterB的值只是公司中的列。要构建页面,我需要检查它们是否标记为“是”。

因此,对于第1页,查询将是:

select * from companies where hardware = 'YES' and web = 'YES';

这将输出 -

Google
Sony
Apple
Microsoft

但我还需要考虑以下列: companyA,companyB和companyC 来自过滤器表。

因此,对于page1,结果应为:

Google
Microsoft
Apple
Sony

关于如何调整我的选择查询以显示基于companyA,companyB和companyC的有序列表的任何想法?

2 个答案:

答案 0 :(得分:0)

嗨,正如您从评论中看到的那样,您的表格未正常化。在这种情况下,您可以使用filter和UNION ALL命令进行多次选择。

所以你的查询将是:

SELECT  
    [C].*
FROM companies AS [C] 
    INNER JOIN filter AS [F] ON [F].companyA = [C].company
WHERE hardware = 'YES' and web = 'YES'
UNION ALL
SELECT
    [C].*
FROM companies AS [C] 
    INNER JOIN filter AS [F] ON [F].companyB = [C].company
WHERE hardware = 'YES' and web = 'YES'
UNION ALL
SELECT  
    [C].*
FROM companies AS [C] 
    INNER JOIN filter AS [F] ON [F].companyC = [C].company
WHERE hardware = 'YES' and web = 'YES'

答案 1 :(得分:0)

你应该规范化你的表格

而不是带有固定列的过滤器和公司表,您应该标准化为:

   table company  
    id,
    company_name

  table filter_tag
    id,
    tag

 table company_filter_status
  id_company
  id_filter_tag_id
  status /*  YES or NOT */

  table filter_relation 
    page,
    company_id,
    filter_tag_id