SELECT orcamentos.id
FROM usuarios, clientes, empresas, orcamentos
WHERE
(
(
clientes.nome LIKE '%VARIAVEL%'
AND clientes.email=usuarios.usuario
)
AND orcamentos.cliente=usuarios.id
)
OR
(
(
(
empresas.razao_social LIKE '%VARIAVEL%'
OR empresas.nome_fantasia LIKE '%VARIAVEL%'
)
AND empresas.email=usuarios.usuario
)
AND orcamentos.cliente=usuarios.id
)
OR orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;
我有这个查询,它可以正常工作,但有性能问题。我想要一些查询结构的提示来optimeze,比如说:在这种情况下更好的是join
等等.SGBD是mysql。
感谢。
答案 0 :(得分:1)
我认为这个查询更清楚:
SELECT orcamentos.id
FROM usuarios
join orcamentos on orcamentos.cliente=usuarios.id
left join clientes on clientes.email=usuarios.usuario
left join empresas on empresas.email=usuarios.usuario
WHERE
COALESCE(clientes.nome,'') + COALESCE(empresas.razao_social,'') +
COALESCE(empresas.nome_fantasia,'') + orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;
注意哪些是左连接,你可以使orcamentos成为左连接,但是你的结果集中将有一行为null。
您仍会遇到性能问题。像clientes.nome LIKE '%VARIAVEL%'
这样的搜索速度很慢,因为无法使用索引。某些SQL平台具有CONTAINS关键字,但除非您使用的产品具有全文搜索功能且已针对要搜索的列启用,否则仍然很慢。需要全表扫描才能在字段中查找任意字符串。索引要快得多。
如果你一直在寻找相同的东西,你可以采取一些技巧来加速搜索。
答案 1 :(得分:0)
以下查询如何:
SELECT orcamentos.id
FROM usuarios
INNER JOIN orcamentos ON orcamentos.cliente = usuarios.id
LEFT JOIN clientes ON clientes.email = usuarios.usuario
LEFT JOIN empresas ON empresas.email = usuarios.usuario
WHERE clientes.nome LIKE '%VARIAVEL%'
OR empresas.razao_social LIKE '%VARIAVEL%'
OR empresas.nome_fantasia LIKE '%VARIAVEL%'
OR orcamentos.nome_cliente LIKE '%VARIAVEL%'
GROUP BY orcamentos.id;