OR
和CASE
求和会起作用,但效率很低,因为它们不使用索引。
您需要使UNION
索引可用。
如果用户将name
、和输入到数据库中phone
,并且您想要检查至少与这些字段中的一个匹配的所有记录,则发出:email
address
3
SELECT i.*
FROM (
SELECT id, COUNT(*)
FROM (
SELECT id
FROM t_info t
WHERE name = 'Eve Chianese'
UNION ALL
SELECT id
FROM t_info t
WHERE phone = '+15558000042'
UNION ALL
SELECT id
FROM t_info t
WHERE email = '42@example.com'
UNION ALL
SELECT id
FROM t_info t
WHERE address = '42 North Lane'
) q
GROUP BY
id
HAVING COUNT(*) >= 3
) dq
JOIN t_info i
ON i.id = dq.id
这将在这些字段上使用索引,并且查询会很快。
有关详细信息,请参阅我的博客中的这篇文章:
另请参阅本文所基于的这个问题。
如果您想DISTINCT
在现有数据中包含值列表,只需将此查询包装到子查询中:
SELECT i.*
FROM t_info i1
WHERE EXISTS
(
SELECT 1
FROM (
SELECT id
FROM t_info t
WHERE name = i1.name
UNION ALL
SELECT id
FROM t_info t
WHERE phone = i1.phone
UNION ALL
SELECT id
FROM t_info t
WHERE email = i1.email
UNION ALL
SELECT id
FROM t_info t
WHERE address = i1.address
) q
GROUP BY
id
HAVING COUNT(*) >= 3
)
请注意,这DISTINCT
不是可传递的:如果A
匹配B
和B
匹配C
,这并不意味着A
匹配C
。