为什么这个复杂的MySQL查询不起作用?

时间:2011-03-06 16:27:55

标签: php mysql database-normalization

我有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,告诉我所有参加比赛的球队。

此查询必须输出团队。

2 个答案:

答案 0 :(得分:2)

Normalize your database

在您的情况下,这意味着拥有一个表Team(team_id,名称,其他),一个表Member(member_id,first_name,last_name),MemberToTeam(member_id,team_id)。换句话说,将member1IDmember2ID移到自己的表格中。

遵循这种做法,除了在一般意义上“改进”您的数据库架构之外,意味着困扰您的查询将变得无关紧要。

如果你知道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);