Jquery MySQL查询以获取exists/not exists的任意组合
我有一个有3列和数百万行的表。都是整数散列 id、属性、属性 id可以有多个包含属性名称和值组合的行 这张桌子有两把钥匙 id、属性、属性 属性,属性,id 我需要动态构建能够根据规则获取ID的查询,例如: 以下所有部分应匹配的ID: 属性包含值或值 属性不包含值或值 ... 以下任何部分应匹配的ID: 属性包含值或值 属性不包含值或值 ... 问题是: 这是我提出的查询,我可以将更改为id NOT in for the NOT contain parts,并将和更改为或从或更改为任何: 问题是这个查询效率不高。 出于某种原因,Mysql扫描所有表行,尽管我单独运行每个子查询时,它只包含几百行 我如何优化这个查询,或者提出一个可以有效处理灵活需求的替代查询。 注:1。Mysql 5.5.31 2。为了便于解释,我简化了查询。实际上,还有一个附加的全局sid列,所有查询在每个where段中都包含sid=XXX。我建议使用group by并具有:Jquery MySQL查询以获取exists/not exists的任意组合,jquery,mysql,sql,optimization,Jquery,Mysql,Sql,Optimization,我有一个有3列和数百万行的表。都是整数散列 id、属性、属性 id可以有多个包含属性名称和值组合的行 这张桌子有两把钥匙 id、属性、属性 属性,属性,id 我需要动态构建能够根据规则获取ID的查询,例如: 以下所有部分应匹配的ID: 属性包含值或值 属性不包含值或值 ... 以下任何部分应匹配的ID: 属性包含值或值 属性不包含值或值 ... 问题是: 这是我提出的查询,我可以将更改为id NOT in for the NOT contain parts,并将和更改为或从或更改为任何:
使用联接比使用嵌套的select语句更有效。我建议从那里开始,看看你有什么改进。不要用在选择,使用JOIN。这是一个很好的解决方案戈登,谢谢,有没有办法做到属性不包含值或者没有“包含”部分?我不认为它会起作用,因为WHERE部分和HAVING部分是否定的。这是一个低效的解决方案,因为'WHERE a,b在1,2。。。根本不优化。如果表格足够小,这样表格扫描就可以了。@RickJames。根据文档中的注释,这实际上是在5.7.3中修复的。@GordonLinoff-谢谢!我错过了那个变更日志条目。
SELECT distinct id FROM attributes
WHERE id IN (
SELECT id FROM attributes
WHERE ( (attribute = 12944489 AND attrib_value = 907348202 )
)
AND id IN (
SELECT id FROM attributes
WHERE (
(attribute = 577513892 AND attrib_val = 519655334 )
OR (attribute = 577513892 AND attrib_val = 1266247963 )
)
)
)
SELECT id
FROM attributes
WHERE (attribute, attrib_value) IN ( (12944489, 907348202), (577513892, 519655334), (577513892, 1266247963) )
GROUP BY id
HAVING SUM( (attribute, attrib_value) IN ( (12944489, 907348202) ) ) > 0 AND
SUM( (attribute, attrib_value) IN ( (577513892, 519655334), (577513892, 1266247963) ) ) = 0;
SELECT id
FROM a AS a1
WHERE attr = 11 AND val IN (22, 33)
AND NOT EXISTS (
SELECT 1 FROM a
WHERE id = a1.id
AND attr = 44
AND val IN (55, 66) )
PRIMARY KEY(id) -- Is this already there? If so, good for inner query
INDEX(attr, val, id) -- needed for outer query