我有2张桌子;成员和团队
会员表 memberID,firstName,lastName
(firstName和lastName是全文索引)
队伍表 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";
此查询必须关闭,但尚未正常工作。
我正在尝试构建一个查询,让我向我展示所有团队“$ q”已开启。
实施例。 $ q = doe,告诉我所有参加比赛的球队。
此查询必须输出团队。
答案 0 :(得分:2)
在您的情况下,这意味着拥有一个表Team
(team_id,名称,其他),一个表Member
(member_id,first_name,last_name),和表MemberToTeam
(member_id,team_id)。换句话说,将member1ID
和member2ID
移到自己的表格中。
遵循这种做法,除了在一般意义上“改进”您的数据库架构之外,意味着困扰您的查询将变得无关紧要。
如果你知道member_id
:
SELECT team_id FROM MemberToTeam WHERE member_id = 1
如果您按名字或姓氏搜索:
SELECT mtt.team_id FROM Member m
LEFT JOIN MemberToTeam mtt ON m.member_id = mtt.member_id
WHERE m.first_name LIKE '%your search string here%' OR m.lastname LIKE '%your search string here%'
答案 1 :(得分: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而不是子选择。 (字段名称重命名为在输入时保存)
select t.* from teams t
inner join members me1 on t.m1 = me1.id
inner join members me2 on t.m2 = me2.id
where MATCH(me1.fname, me1.lname, me2.fname, me2.lname)
AGAINST('smith' IN BOOLEAN MODE);