mySQL查询w /全文索引搜索,如果他们在另一个表中有数据,则返回X个结果数

时间:2014-12-15 21:40:31

标签: mysql

所以,这是一个很难说的问题:

我希望能够限制在全文索引中搜索时返回的结果数量。

简单地使用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并仅返回用户13。这只是创建一个较慢的查询?我应该限制之后的结果数量吗?我最终会搜索数百万条记录。我不确定从哪里开始 - 感谢任何帮助!

2 个答案:

答案 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