MySQL查询产品属性表

时间:2014-11-07 08:03:08

标签: php mysql sql

我有一个包含产品和属性关系的mysql表,

id  productid attributeid arributevalueid
18  521       12           36
17  521       11           43
16  521       9            16
29  522       18           168
28  522       17           138
27  522       16           115
26  522       15           71
25  522       12           36
24  522       11           48
23  522       9            19

我在编写SQL查询时遇到问题,我正在尝试过滤具有所有属性的产品,

ex - 如果我传递属性值16和36,则匹配的产品为521

我在下面测试一个mysql查询

$nweryt=mysql_query('SELECT * FROM 
tbl_proattrconnect 
WHERE 
tbl_proattrconnect.attroid=9 AND tbl_proattrconnect.attrvalid=16 
AND tbl_proattrconnect.attroid=12 AND tbl_proattrconnect.attrvalid=36');

echo mysql_num_rows($nweryt);

但这不能得到结果并显示0,任何人都可以帮助我,非常感谢

4 个答案:

答案 0 :(得分:2)

请试试这个:

SELECT
productid
FROM
tbl_proattrconnect
GROUP BY productid
HAVING SUM(attributevalueid IN (16, 36)) >= 2 /*here you specify after the >= how many attributes you have in IN()*/
AND SUM(attributevalueid BETWEEN x and y) >= 1 /*here you just always leave it at >= 1*/
AND SUM(attributevalueid BETWEEN z and w) >= 1 /*feel free to add as much checks as necessary.*/

这使用了一个小技巧。 attributevalueid IN (16, 36)返回true或false,1或0.

或者你可以自己加入表格,但是这可能会有一些更糟糕的表现,如果你需要检查更多的属性,可能会非常笨拙。你必须为每个属性自己加入一次表。

答案 1 :(得分:1)

您需要将表连接到自身以实现此目的。例如:

SELECT t1.productid
FROM tbl_proattrconnect t1
JOIN tbl_proattrconnect t2 ON t1.productid = t2.productid
WHERE
  (t1.attroid = 9 AND t1.attrvalid = 16)
AND
  (t2.attroid = 12 AND t2.attrvalid = 36)

答案 2 :(得分:0)

也许你打算使用OR而不是AND?再试一次,这将显示521和522

$nweryt=mysql_query('SELECT * FROM 
tbl_proattrconnect 
WHERE 
tbl_proattrconnect.attroid=9 AND tbl_proattrconnect.attrvalid=16 
OR tbl_proattrconnect.attroid=12 AND tbl_proattrconnect.attrvalid=36
order by productid'
);

答案 3 :(得分:0)

您的查询中有错误,因为您使用的是AND运算符而不是OR。 记住:

  • 如果第一个条件和第二个条件都为真,则 AND 运算符会显示一条记录。
  • 如果第一个条件或第二个条件为真, OR 运算符会显示一条记录。

阅读此信息http://www.w3schools.com/sql/sql_and_or.asp

$nweryt=mysql_query('SELECT * FROM tbl_proattrconnect 
                     WHERE 
                       tbl_proattrconnect.attroid=9 AND tbl_proattrconnect.attrvalid=16 
                     OR 
                       tbl_proattrconnect.attroid=12 AND tbl_proattrconnect.attrvalid=36');

echo mysql_num_rows($nweryt); 

也可以编写相同的查询但更短:

SELECT * FROM 
tbl_proattrconnect 
WHERE 
    tbl_proattrconnect.attroid IN(9,12) AND tbl_proattrconnect.attrvalid IN(16,36);