2011-03-06 19 views
0

私は2つのテーブルを持っています。メンバーとチームこの複雑なMySQLクエリはなぜ機能しないのですか?

メンバー表 MEMBERID、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」がオンになっています。

Ex。 $ q = doe、doeがオンになっているすべてのチームを表示してください。

このクエリはチームを出力する必要があります。

+0

"私は助けが必要です"は質問ではないので、質問のタイトルを改めてください。 –

+1

クエリを把握するのは難しいです。完全なクエリを表示する - echo $ sql; –

+0

通常、チーム、メンバー、チームメンバーの3つのテーブルが存在します。 2つのテーブルを使用しているので、クエリの方法を変更することをお勧めします。ところで、あなたは$ limitの前にLIMITの単語を忘れました – frail

答えて

2

一つの可能​​な理由は、完全に最小の長さがありあり-text検索。デフォルトは4文字です。 "doe"はこの試合に失敗します。あなたは(いつも行くための「最良の」方法ではありません)正規化を避けたい場合は、あなたが少なくとも使用ではなく、サブのののJOINができ、ちなみに
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_ft_min_word_len

「ft_min_word_len」変数を経由して、これを増やすことができます-selects .. eg (入力時に節約するようにフィールド名が変更されました)

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); 
+0

素晴らしい解決策!私は別の列やエイリアスで同じテーブルに参加するインナーについて考えなかった。それは治療を働いた! – rprincejr

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%' 
+0

私はいつも正規化を支持しているわけではありませんが、正規化の恩恵を受けるデータベースがあればそれがあります:) – extraneon

+0

OK、 3番目の表memberToTeam、私はいくつかの質問があります。チームが編集され、チームメンバーの1人が変更されるとどうなりますか?私は本当にどのようにメンバーのIDがチームレコードで変更されているため、既存のmemberToTeamレコードを更新できるか分かりません。 – rprincejr

+0

@rprincejr:あなたが理解していれば、Teamテーブルにmember1IDとmember2IDがあると仮定しています。Jonの例(3つのテーブル)ですが、これは必要ありません。正規化(member1IDフィールドとmember2IDフィールドを新しいテーブルに移動することは、達成しようとしていることに本当に依存しています(つまり、チームには常に2人のメンバーしかいません)。詳細は私の答えを参照 –

関連する問題