2012-04-26 5 views
1

내 테이블의 내부 조인 시나리오에 걸렸습니다. 저를 도와주세요? 내가 여기서 뭘 잘못하고 있니? 여기 MySQL 내부가 하나의 열에 두 개의 열을 결합합니다.

내가 할 노력하고있어 시나리오입니다 :

내가 결제 및 배송 국가가가/I는 내부 조인 채워하려고 열을 주장하지만, 어떻게 든이 작동하지 않습니다. 도와 주셔서 대단히 감사합니다.

$sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country OR ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id 
    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".states OR ".TBL_USERS.".bstates = ".TBL_STATES.".states_id 
    WHERE ".TBL_USERS.".username = '$username'"); 

나는 검색어를 (으)로 변경했습니다. 에러 메신저 뻥이

PHP 치명적인 오류는 다음과 같습니다 catch되지 않은 예외 'PDOException'메시지 'SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1,066하지 독특한 테이블/별칭 :'국가 ''

$sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id 
    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".states = ".TBL_STATES.".states_id 

    INNER JOIN ".TBL_STATES." ON ".TBL_USERS.".bstates = ".TBL_STATES.".states_id 

    WHERE ".TBL_USERS.".username = '$username'"); 
에서 참조 field 부울 타입의 경우를 제외하고 여기

확인, 올바른 구문의 감사에게 @ Tiberiu-누트 스탠

$sql = $this->connection->query("SELECT * FROM ".TBL_USERS." 
    LEFT JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id 

    LEFT JOIN ".TBL_COUNTRIES." AS ".TBL_COUNTRIES."_b ON ".TBL_USERS.".bcountry=".TBL_COUNTRIES."_b.country_id 

    INNER JOIN ".TBL_USER_LEVEL." ON ".TBL_USERS.".userlevel = ".TBL_USER_LEVEL.".user_level_id 
    LEFT JOIN ".TBL_STATES." ON ".TBL_USERS.".states = ".TBL_STATES.".states_id 

    LEFT JOIN ".TBL_STATES." AS ".TBL_STATES."_b ON ".TBL_USERS.".bstates=".TBL_STATES."_b.states_id 


    WHERE ".TBL_USERS.".username = '$username'"); 
+1

정확히 작동하지 않는 것은 무엇입니까? –

+1

SQL 오류가 발생합니까? 그렇다면 게시 할 수 있습니까? 처음에는 JOIN 절에서 OR을 사용할 수 있다고 생각하지 않습니다.별로 의미가 없습니다. MySQL 문서에서 어쨌든 볼 수 없습니다. – fred2

답변

1

조인 문에서 OR 및 AND를 사용할 수 있습니다. 나는 항상 그렇게한다.

LEFT JOIN `currencies` ON (
    `currency_foreign`=`invoice_entry_amount_currency` 
    AND 
    `currency_reference`='".$strTransformToCurrency."' 
    AND 
    `currency_date`=FLOOR(`invoice_paid_timestamp`/86400)*86400 
) 

문제는 여기에 있습니다 : : 여기에 작동 하나

INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id 
    INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".bcountry = ".TBL_COUNTRIES.".country_id 

MySQL은 MySQL은 .country가 생각하기 때문에 (국가 테이블에 가입 할 수있는 관계를 결정할 수없고 .countryb은 다를 수 있습니다 - 그래서 join 후에 조건이나 순서에 대해 반환되거나 사용될 열이 무엇인지 알지 못합니다.

같이 그것을 시도 :

INNER JOIN ".TBL_COUNTRIES." ON ".TBL_USERS.".country = ".TBL_COUNTRIES.".country_id 
    INNER JOIN ".TBL_COUNTRIES." AS ".TBL_COUNTRIES."_b ON ".TBL_USERS.".bcountry=".TBL_COUNTRIES."_b.country_id 

을 경우 당신은 정말 큰 테이블을 가지고 조건 및 주문을 포함한 전체 최종 쿼리를 설명 할 찾아 MySQL이 때문에 "TBL_USERS의 테이블 사본을하고있는 경우 AS TBL_USERS_B "로 변경하십시오.

+0

동일한 오류가 발생합니다. PHP 치명적 오류 : 'SQLSTATE [42000] : 구문 오류 또는 액세스 위반과 함께'PDOException '예외가 발생했습니다. 1066 고유 테이블/별칭이 아닙니다 :'countries '' – user961885

+0

TBL_STATES;) –

+0

내가 보여준 것처럼 TBL_COUNTRIES에서와 마찬가지로 TBL_STATES에 대한 별칭을 추가하십시오. –

1

당신은 JOIN table ON field OR another_field = expression 같은 구조를 사용할 수 없습니다에 많이 있습니다.

$sql = $this->connection->query("SELECT * FROM $TBL_USERS 
    JOIN $TBL_USER_LEVEL ON $TBL_USERS.userlevel = $TBL_USER_LEVEL.user_level_id 
    JOIN $TBL_COUNTRIES ON $TBL_USERS.country = $TBL_COUNTRIES.country_id 
     OR $TBL_USERS.bcountry = $TBL_COUNTRIES.country_id 
    JOIN $TBL_STATES ON $TBL_USERS.states = $TBL_STATES.states_id 
     OR $TBL_USERS.bstates = $TBL_STATES.states_id 
    WHERE $TBL_USERS.username = '$username'"); 

내가 직접 변수를 사용하고, 문자열 연결로, 그렇지 않으면 많은 혼란 같습니다

이 같은 사건에 뭔가, 부울 결과를 반환합니다 구조를 사용해야합니다. 그리고 지금 검색어는 SQLi에 대해 열려 있습니다.

+0

해당 쿼리는 입력 변수 (argv, $ _GET 등)를 사용하여 직접 또는 간접적으로 각각의 변수에 쓰기가 가능한 경우에만 SQL 주입을 위해 열립니다. –

+0

btw는 변수가 아니며 상수이기 때문에 요청 매개 변수에서 값을 가져 오는 것은 거의 불가능합니다. –

관련 문제