2014-03-27 3 views
0

저는 재미있는 일과 학습을위한 개인 프로젝트로 PHP와 MySQL 사전을 만들고 있습니다. 그러나 MySQL이 사전 항목을 검색하는 방법을보다 정확하게하려고 할 때 문제가 발생했습니다.MySQL을 사용하여 복잡한 다중 테이블 검색 쿼리 수행

내 쿼리의 의도는 '입력'테이블 (아래에서 설명 함)에서 '단어'로 제공된 단어를 검색하고 결과가 발견되면 '대안'에서 모든 '대체'를 나열하는 것입니다. 그것으로.

그러나 결과가 없으면 '대체 단어'를 검색하고 '대체 단어'로 제공된 단어를 검색 한 다음 동일한 단어가있는 '항목'테이블에서 해당 단어를 검색합니다 '.

나는이 실수 코드로이를 달성 할 수 있었다 :

SELECT alternatives.word, alternatives.alternative, entries.added 
    FROM alternatives 
INNER JOIN entries 
    ON entries.word = alternatives.word 
WHERE entries.word = (SELECT word 
         FROM alternatives 
         WHERE alternative = "randomword" 
          OR word = "randomword" LIMIT 1) 

불행하게도,이 코드는이 계정 관리에 중요한 문제를 고려하지 않습니다, 단어는 '대안'에있을 수 있다는 것입니다, 하지만 여전히 '항목'에 항목이 있습니다. (예 : 'entries'에는 'query'및 'querying'이 포함될 수 있으며 'query'에는 대안으로 'querying'이 표시되는 반면 'querying'에는 대안으로 'query'가 표시됩니다.)

' 대안 '테이블 :

id | word [the word the alternative word is based on] | alternative [alternative word] | type [verb/noun/adjective etc...] 

'항목 '테이블 :이 문제에 대한 쉬운 해결책이

id | word [the word] | date [timestamp of entry, must be returned] 

있습니까? 나는 지금 완전히 붙어있다.

답변

0

나는 정확하게 당신이 뭘하고 있는지 100 % 아니지만, 만약 내가 올바르게 이해하고 있다면이 코드가 내가 생각하는대로 작동한다면 제대로 작동 할 것입니다.

항목에서 단어를 찾아보고 싶으면 작성 날짜와 함께 반환하고 동일한 결과 집합에서 모든 단어와 날짜를 반환하려는 경우 그 단어에 대한 대안. 이 다음 찾을 수 있다면 당신이 대안 테이블에서 단어를 검색하는 다른 모든 단어를 반환하고자하는 대안과 타임 스탬프 여기서주의해야 할

IF (SELECT 1 = 1 FROM entries WHERE word = 'wordtosearch') THEN 
BEGIN 
    SELECT a.alternative, e.date 
    FROM alternatives a 
     INNER JOIN entries e ON a.alternative = e.word 
    WHERE a.word = 'wordtosearch' 
    UNION 
    SELECT word, date 
    FROM entries 
    WHERE word = 'wordtosearch'; 
END; 
ELSE 
BEGIN 
    SELECT e.word, e.date 
    FROM alternatives a 
     INNER JOIN entries e ON a.word = e.word 
    WHERE a.alternative = 'wordtosearch'; 
END; 
END IF; 

한 가지는 것은 완전히 다른 논리를 원하는 것입니다 레코드의 존재를 기반으로, 이것은 조인으로 가능할 수 있지만, 가장 쉽고 가장 판독 가능한 솔루션이 두 작업을 완전히 분리 할 것이라고 생각했습니다. 또한 두 결과 세트가 동일한 열을 반환하는 것이 중요합니다. 그렇지 않으면 제대로 처리하기 어려운 알 수없는 결과 세트 정의 (예 : 알 수없는 열 수)로 끝날 수 있습니다.

+0

이걸 실행하려했지만 오류가 발생했습니다 :'# 1064 - SQL 구문에 오류가 있습니다. 'IF EXISTS (SELECT * FROM entries WHERE word = "wordtosearch") 근처에서 사용할 올바른 구문에 대한 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. BEGIN SELECT'at line 1 ' – Forest

+0

죄송합니다. SQL 서버와 MYSQL 문법은 약간 다릅니다. 나는 나의 대답을 편집했다. –