我有2张 table ;成员和团队
成员表memberID,firstName,lastName
(firstName和lastName是全文索引)
team table team_id,member1ID,member2ID
这是我的查询
$sql = "SELECT a.* ";
$sql .= "FROM teams a WHERE ";
$sql .= "a.member1ID IN (SELECT b.memberID FROM members b ";
$sql .= "WHERE MATCH(b.firstName, b.lastName) AGAINST('$q' IN BOOLEAN MODE)) ";
$sql .= "OR a.member2ID IN (SELECT b.memberID FROM members b ";
$sql .= "WHERE MATCH(b.firstName, b.lastName) AGAINST('$q' IN BOOLEAN MODE)) ";
if($year)
$sql .= "AND a.team_y = $year ";
$sql .= "ORDER BY a.team_num ASC ";
if($limit)
$sql .= "$limit";
此查询必须很接近,但它还没有工作 .
我试图 Build 一个查询,让我告诉我所有团队“$ q”正在进行 .
防爆 . $ q = doe,告诉我所有参加比赛的球队 .
此查询必须输出团队 .
2 回答
查询不起作用的一个可能原因是全文搜索的最小长度,默认为4个字符 . "doe"会使这场比赛失败 . 您可以通过变量"ft_min_word_len"增加此值
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_ft_min_word_len
顺便说一句,如果你想避免规范化(这并不总是“最好”的方式),你至少可以使用JOIN而不是子选择 . (字段名称重命名为在输入时保存)
Normalize your database .
在您的情况下,这将意味着有一个表
Team
(team_id,名称,其他),表Member
(member_id,first_name,last_name)和表MemberToTeam
(member_id,team_id) . 换句话说,将member1ID
和member2ID
移动到他们自己的表中 .遵循这种做法,除了在一般意义上“改进”您的数据库模式之外,意味着困扰您的查询将变得无关紧要 .
如果你知道
member_id
:如果您按名字或姓氏搜索: