所以,这是一个很难说的问题:
我希望能够限制在全文索引中搜索时返回的结果数量。
简单地使用LIMIT 5
并不能满足我的需要。
我正在搜索此查询:
SELECT * FROM people
WHERE MATCH (name, email) AGAINST ('$val*' IN BOOLEAN MODE)
ORDER BY MATCH(name, email) AGAINST('$val*')
DESC
我需要在此查询中添加某种IF
语句以返回正确的行。现在,这将返回10个人的名字和电子邮件(让我们说)。这些人中只有6人拥有"斑点",这意味着他们实际上已经在网站上做了些什么。斑点在另一张表中计算。如果这些人做了某些事情(有1个以上的点),我希望他们在结果中显示,而那些没有做过任何事情的人,我想在搜索中消除它们。
所以,在lamens术语中(因为我不知道如何在技术上这样做)我需要搜索说
SELECT * FROM people
WHERE MATCH (name, email) AGAINST ('$val*' IN BOOLEAN MODE)
ORDER BY MATCH(name, email) AGAINST('$val*')
---as long as this person has at least 1 spot---
DESC
表格设置如下:
people
|id | name | email |
|---|----------------|---------------------|
|01 | John Smith | jsmith@domain.com |
|02 | Johnny Johnson | Ejohnson@domain.com |
|03 | Jon Aten | name@domain.com |
...
spots
|id | user_id | spot_number|
|---|---------|------------|
|01 | 01 | 01 |
|02 | 01 | 03 |
|03 | 01 | 06 |
|04 | 01 | 12 |
|05 | 01 | 04 |
|06 | 03 | 02 |
|07 | 03 | 15 |
|08 | 03 | 31 |
|09 | 01 | 12 |
|10 | 01 | 10 |
如您所见,Johnny
(用户ID 2)在spot表中没有任何位置。我希望能够搜索jo
并仅返回用户1
和3
。这只是创建一个较慢的查询?我应该限制之后的结果数量吗?我最终会搜索数百万条记录。我不确定从哪里开始 - 感谢任何帮助!
答案 0 :(得分:2)
您可以根据查询中的user_id将表连接在一起,这样就可以获得两个表共有的人员列表:
SELECT * FROM people p, spots s
WHERE MATCH (p.name, p.email) AGAINST ('$val*' IN BOOLEAN MODE)
AND
p.id = s.user_id
ORDER BY MATCH(name, email) AGAINST('$val*')
DESC
LIMIT 5
如果您希望用户列表中包含多个点(无论spot_number值如何),您可以对people表中的行执行'group by'查询,并在spot表中对应的行进行计数,然后使用sql的'having'子句来过滤计算的行数。
例如,查找具有多个点的人的所有名称(在点表中也大于1行):
SELECT p.name, count(s.spot_number) c FROM people p, spots s
WHERE MATCH (p.name, p.email) AGAINST ('$val*' IN BOOLEAN MODE)
AND p.id = s.user_id
group by p.name having c > 1
ORDER BY MATCH(name, email) AGAINST('$val*') DESC
LIMIT 5
是的,连接会影响性能,请确保将spot.user_id列编入索引。
答案 1 :(得分:1)
INNER JOIN
是你的英雄:
SELECT * FROM people
INNER JOIN spots ON people.id = spots.user_id
WHERE MATCH (name, email) AGAINST ('$val*' IN BOOLEAN MODE)
ORDER BY MATCH(name, email) AGAINST('$val*')
DESC
记住你的SQL连接维恩图是非常有用的: sql joins as venn diagram