简体   繁体   English

内部联接中多个列的多个AND

[英]Multiple ANDs from multiple columns in an Inner Join

I have a table of products, a table of custom definitions, and a table of values: 我有一个产品表,一个自定义定义表和一个值表:

products 制品

id   product_name         price
48   product one          32.99
87   another product      2.50
...etc

fielddefs fielddefs

id   name
6    brand
9    colour
23   flavour
...etc

fieldvals fieldvals

product_id   fielddef_id   value
48           6             Rowntree
48           9             Red
48           23            Strawberry
87           6             Cadburys
87           9             Yellow
87           23            Lemon
etc...

I am now trying to do a search using a filter with drop-down selections for each fielddef: 我现在正在尝试使用带有每个fielddef下拉选择的过滤器进行搜索:

$sql = "SELECT * FROM products INNER JOIN fieldvals ON fieldvals.product_id=products.id WHERE product_name LIKE '%".$q."%' AND (fielddef_id='7' AND value='".$c."') AND (fielddef_id='8' AND value='".$b."') AND (fielddef_id='9' AND value='".$f."') AND (fielddef_id='10' AND value='".$t."') AND (fielddef_id='5' AND value='".$h."') AND (fielddef_id='6' AND value='".$v."')"; $ sql =“ SELECT * FROM products INNER JOIN fieldvals on fieldvals.product_id = products.id WHERE product_name类似'%”。$ q。“%'AND(fielddef_id ='7'AND value ='”。$ c。“' )AND(fielddef_id ='8'AND value ='“。$ b。”')AND(fielddef_id ='9'AND value ='“。$ f。”')AND(fielddef_id = '10'AND value =' “。$ t。”')AND(fielddef_id ='5'AND value ='“。$ h。”')AND(fielddef_id ='6'AND value ='“。$ v。”')“;

An echo of the SQL gives me something like: SQL的回显给了我类似的东西:

SELECT * FROM products INNER JOIN fieldvals ON fieldvals.product_id=products.id WHERE product_name LIKE '%cola%' AND (fielddef_id='7' AND value='Purple') AND (fielddef_id='9' AND value='Apple') AND (fielddef_id='10' AND value='Party') AND (fielddef_id='5' AND value='true') AND (fielddef_id='6' AND value='true') SELECT * FROM products INNER JOIN fieldvals on fieldvals.product_id = products.id WHERE product_name类似'%cola%'AND(fielddef_id ='7'AND value ='Purple')AND(fielddef_id ='9'AND value ='Apple' )AND(fielddef_id = '10'AND value ='Party')AND(fielddef_id ='5'AND value ='true')AND(fielddef_id ='6'AND value ='true')

This code only works for one criteria after the $q - ie you can include $q and $c, or $q and $h, or $q and $v, and it successfully finds matching products, but multiple nested AND statements do not seem to work. 此代码仅对$ q之后的一个条件起作用-即,您可以包括$ q和$ c,或$ q和$ h,或$ q和$ v,它可以成功找到匹配的乘积,但是多个嵌套的AND语句不似乎有效。

Where am I going wrong? 我要去哪里错了?

This link offers a similar question where someone wanted to query from the same "field data" table and wanting multiple conditions. 此链接提供了一个类似的问题 ,即有人要从相同的“字段数据”表中查询并且需要多个条件。

The issue you are encountering is that for any single record, none of them can have MULTIPLE values for a given column, only a result of comparing multiple records and applying a HAVING COUNT(*) = criteria you are looking for. 您遇到的问题是,对于任何单个记录,对于给定的列,它们都不能具有MULTIPLE值,这仅仅是比较多个记录并应用HAVING COUNT(*)=您要查找的条件的结果。 The other (per my link above) shows that. 另一个(通过我上面的链接)显示了这一点。 Now how can this similar approach be applied to your problem. 现在如何将这种类似的方法应用于您的问题。

SELECT 
      P.ID,
      P.Product_Name,
      P.Price
   FROM 
      products P
         INNER JOIN fieldvals FV1
            ON P.id = FV1.product_id 
            AND FV1.FieldDef_ID = '7'
            AND FV1.Value = 'value expected for 7'

         INNER JOIN fieldvals FV2
            ON P.id = FV2.product_id 
            AND FV2.FieldDef_ID = '8'
            AND FV2.Value = 'value expected for 8'

         INNER JOIN fieldvals FV3
            ON P.id = FV3.product_id 
            AND FV3.FieldDef_ID = '9'
            AND FV3.Value = 'value expected for 9'

         (continue same "join" sample above for as many
          criteria conditions you need to add... just keep
          incrementing the alias ... FV1, FV2, FV3, etc...)
   WHERE 
      P.Product_Name like '%your criteria%'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM