2016-06-07 3 views
0

테이블이 있습니다 questions에는 데이터베이스에 다른 테이블 이름을 포함하는 service_table 열이 있습니다.하위 쿼리 트로 메인 쿼리의 액세스 테이블 이름

테이블 q.service_table이

질문을 존재하지 않습니다 오류가이 쿼리 결과를 실행

SELECT * FROM `questions` AS `q` 
WHERE EXISTS 
(SELECT * 
FROM 
    `q`.`service_table` AS `ent1` 
WHERE ent1.user_id = q.user_id) 

:
은 내가 서브 쿼리에이 테이블 이름에 액세스해야 테이블 스키마 :

id  user_id service_type service_id title description 
------ ------- -------------- ------------ ------ ----------- 
1  83  translates   1   nana hi there  
,

translates 테이블 (질문과 관련된 서비스 중 하나) 스키마 :

id  user_id context 
------ ------- -------------- 
1  83   something      
+1

테이블 스키마를 제공합니다. – Alex

+2

잘못된 테이블 스키마와 비슷합니다. 왜 이런 짓을 한거야? MySQL은 관계형 데이터베이스이므로 원하는 동적 동작이 없습니다! 관계가 무슨 의미인지 알지? 한 가지 질문에 여러 번역본이 있습니다. 당신은 당신의 스키마를 overthink해야합니다. – etalon11

+0

당신이 무슨 말을하고 있는지 모르겠지만, 여러 테이블'translates','typings','theses'는 특정 질문과 관련 될 수 있습니다. 그래서 뭐가 잘못 됐나요? – alex

답변

2

은 내가 서브 쿼리

가능하지 않음이 테이블 이름에 액세스해야합니다.

쿼리가 처음 구문 분석 될 때 서버가 이해해야하는 사항에 대해서는 모든 방언에서 잘 정의 된 경계가 있습니다. 그것들은 "나중에"(예를 들어 행 데이터로부터) 제공 될 수 없습니다. 객체 식별자는 그 중 하나입니다. 스키마/테이블/컬럼 이름은 행을 검사하기 전에 설정됩니다.

여기에 대안이 있으며, 스케치가 적절하다면 설계가 자유롭기 때문입니다.

SELECT q.* 
    FROM questions q 
WHERE CASE q.service_table 
     WHEN 'translates' 
     THEN EXISTS (SELECT * FROM translates x WHERE x.user_id = q.user_id) 
     WHEN 'typings' 
     THEN EXISTS (SELECT * FROM typings x WHERE x.user_id = q.user_id) 
     WHEN 'theses' 
     THEN EXISTS (SELECT * FROM theses x WHERE x.user_id = q.user_id) 
     ELSE NULL END; 

더욱 정확한 설계는 각각의 서비스는 기본이다 둘 USER_ID있다 "user_has_service"및 SERVICE_ID, 같은 ID 및 이름과 테이블이 "서비스"로서 표 것 키.

그런 다음 "question"테이블에서 service_id를 사용하십시오.

SELECT * 
    FROM question q 
    JOIN user_has_service h 
    ON h.user_id = q.user_id 
    AND h.service_id = q.service_id; 

더 간단할까요? 이것은 더 잘 수행되고, 유지 보수가 쉽고, 관계형 데이터베이스 설계의 일관성있는 i 원칙이며 개별 서비스마다 별도의 테이블이 필요하지 않습니다.

+0

감사합니다. 난 아마 당신이 내 문제의 간단한 예제와 혼란스러워, 사실 나는 또한 주요 쿼리에서 자신의 열 값에 액세스해야 여러 서비스 테이블이 있습니다. 그래서 두 가지 선택이 있습니다. 먼저 모든 서비스에'left join '할 수 있고 관련 서비스 테이블을 찾을 조건을 확인하거나'case' 문으로 설명하는대로 할 수 있습니다.하지만 난 당신이 제안한 피벗 테이블 솔루션이 작동하는지 모르겠다 나는 액세스 서비스 테이블 데이터 (다형성 관계)가 필요하기 때문에. 나는 속력을 빠르게 할 것 인 속력이라고 생각했다. 그러나 진리가 아닌 것처럼 보인다. 그래서 나는 'join'에 되돌아왔다. – alex

0
SELECT q.* FROM questions q 
INNER JOIN translates ent1 
ON ent1.user_id = q.user_id 

나는 것은 당신은 쿼리에서 동적 테이블 이름을 사용할 수 없습니다. 허용되지 않습니다.

+0

오류 코드 : 1146 'pnu.service_table'테이블이 존재하지 않습니다. – alex

관련 문제