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

クエリが機能しない理由の 1 つとして、全文検索の最小長が 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 に答える