首页 文章

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

提问于
浏览
0

我有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 回答

  • 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);
    
  • 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%'
    

相关问题