0

我有 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 , 显示 doe 所在的所有团队。

此查询必须输出团队。

4

2 回答 2

2

规范化您的数据库

在您的情况下,这意味着有一个表Team(team_id、name 等)、一个表Member(member_id、first_name、last_name)一个表MemberToTeam(member_id、team_id)。换句话说,将member1IDand 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%'
于 2011-03-06T16:37:38.213 回答
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);
于 2011-03-06T16:50:08.603 回答