2011-03-06 3 views
0

2 개의 테이블이 있습니다. 회원들과 팀왜이 복잡한 MySQL 쿼리가 작동하지 않습니까?

회원 테이블 MEMBERID, 이름, 성

(이름 및 성이 전체 텍스트 인덱스입니다)

팀은 테이블 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, 미상 인 모든 팀을 보여주십시오.

이 쿼리는 팀을 출력해야합니다.

+0

"도움이 필요합니다"는 질문이 아니기 때문에 질문 제목을 다시 말하십시오. –

+1

쿼리를 이해하기 어렵습니다. 우리에게 완전한 쿼리를 보여줍니다 - echo $ sql; –

+0

일반적으로 팀, 구성원, 팀원 등 3 개의 테이블이 있습니다. 하지만 당신이 2 테이블을 사용하기 때문에 당신이 쿼리하는 방식을 바꿀 것을 제안 할 것입니다. 그건 그렇고 $ 한계 전에 LIMIT 단어를 잊어 버렸습니다 – frail

답변

2

쿼리가 작동하지 않는 한 가지 가능한 이유는 최소 길이 전체에가 있습니다 :

SELECT team_id FROM MemberToTeam WHERE member_id = 1 

당신은 첫 번째 또는 마지막 이름으로 검색하는 경우 -text 검색. 기본값은 4 자입니다. "doe"는이 경기에서 실패합니다. 당신이 (항상 갈 수있는 "최고"방법이 아니다) 정규화를 방지하려는 경우, 그런데
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. 귀하의 경우에는

,이, 테이블 Member (MEMBER_ID, FIRST_NAME, LAST_NAME) 테이블 MemberToTeam (MEMBER_ID, team_id)을 테이블 Team (어떤 다른 team_id, 이름)을 갖는 것을 의미한다. 즉, member1IDmember2ID을 자신의 테이블로 이동하십시오.

일반적으로 데이터베이스 스키마를 "향상"한다는 것은 별개로 당신을 귀찮게하는 쿼리가 작성하기가 쉽다는 것을 의미합니다.

당신이 알고있는 경우 member_id :

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

좋아, memberToTeam이라는 세 번째 테이블에는 몇 가지 질문이 있습니다. 팀이 수정되고 팀 구성원 중 하나가 변경되면 어떻게됩니까? memberID가 팀 레코드에서 변경 되었기 때문에 기존 memberToTeam 레코드를 업데이트하는 방법을 알지 못합니다. – rprincejr

+0

@rprincejr : 이해 하겠다면 Team 테이블에 member1ID & member2ID가 여전히 있다고 가정하고 있습니다. Jon의 예 (3 개 테이블)는 필요하지 않습니다. 정규화 (member1ID 및 member2ID 입력란을 새 표로 이동하는 것은 실제로 달성하려는 작업 (팀원은 항상 2 명의 회원 만 보유하고 있음)에 달려 있습니다.이 경우 어쩌면 테이블 구조가 좋을 수도 있습니다. 자세한 내용은 내 대답을 참조하십시오 –

관련 문제