我有一个包含产品和属性关系的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,任何人都可以帮助我,非常感谢
答案 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。 记住:
阅读此信息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);