2014-09-04 4 views
0

두 테이블을 조인 할 때 사용자 테이블에 분기 코드 필드에 아무 것도없는 경우 SQL 쿼리는 분기 코드 만 반환한다는 기준이 있습니다.조건으로 SQL 조인 된 테이블 조회

그러나 사용자 테이블에 분기 코드 상자에 NULL이 있으면 분기 테이블의 모든 분기 코드가 반환됩니다.

아래는 내가 시도한 것이며 작동하지 않지만 필자가 사용하고있는 테이블과 필드에 약간의 성향을 부여해야합니다.

SELECT IF(u.BranchCode IS NOT NULL THEN b.BranchCode ELSE u.BranchCode END) AS BranchCode, b.BranchName, b.BranchAddress1, b.BranchAddress2 
FROM users AS u 
LEFT JOIN branches AS b ON u.BranchCode = b.BranchCode 
WHERE u.Username = '$_SESSION[USERNAME]' 

일부 테이블 예 :

사용자

UserName | BranchCode 
---------|------------------ 
bob  | NULL 
sam  | AW3456 
dave  | NULL 
alison | NULL 
fred  | NULL 

지점

BranchCode| BranchName |BranchAddress1 |BranchAddress2 
----------|-------------|---------------|------------------- 
AQ3459 | Northmore |1 Northmore Rd |Northmore Village 
AW3456 | Middleton |28 Main Rd  |Middleton Stoney 
DE5689 | Western  |451 Station Rd |Western 
FR3278 | Easterly |12 Acacia Dr |Easterly Estate 

그래서 밥이가 BranchCode 정보의 ALL을 반환에 로그인하는 사용자 인 경우, 예를 들어 :

BranchCode| BranchName |BranchAddress1 |BranchAddress2 
----------|-------------|---------------|------------------- 
AQ3459 | Northmore |1 Northmore Rd |Northmore Village 
AW3456 | Middleton |28 Main Rd  |Middleton Stoney 
DE5689 | Western  |451 Station Rd |Western 
FR3278 | Easterly |12 Acacia Dr |Easterly Estate 

샘이 사용자의 테이블에 지정된 것대로 그의 BranchCode 정보의 조회를 반환에 로그인하는 사용자 인 경우 :

BranchCode| BranchName |BranchAddress1 |BranchAddress2 
----------|-------------|---------------|------------------- 
AW3456 | Middleton |28 Main Rd  |Middleton Stoney 
+1

사용자 테이블과 링크되지 않은 분기 테이블에서 모든 데이터를 원하십니까? –

+0

내가 당신의 SQL에 혼란스러워하지 않는다고 말하면 나는 거짓말을합니다. 테이블과 더미 데이터에 대한 간단한 컬럼 설명을 줄 수있는 방법이 있습니까? – Jhecht

+0

@Jhecht - 다시 읽은 후 'LEFT JOIN'/slaps_forehead –

답변

1
함께 와서이 질문에 대답 할 것이다 SQL과 더 나은

아마도 사람 순수한 SQL 방식이지만, 필자는 코딩 과정에서 KISS 규칙을 따르기를 원하기 때문에 쿼리를 상당히 단순하게 유지하는 경향이있다. 이 답변은 귀하가 원하는 방식으로 100 % 귀하의 질문에 답변하지 않으므로 나는 그들이 희망합니다.

우리가 준 SQL을 사용하면이 쿼리에 PHP를 사용하고 있다고 가정 할 수 있습니다. 또한 쿼리를 통해 이전에 users 테이블을 호출 한 것으로 보입니다. 이 호출에서 사용자 이름 변수와 마찬가지로 세션에 BranchId 열을 저장하십시오. $_SESSION['branchId']이 (가 NULL 일 경우에도)로 설정하고 mysqli_connect() 통화가 $con라는 변수에 저장한다는 가정하에

, 당신은 다음과 같은 일을 할 수 있습니다

이 질문에 대답 (그러나하지 않으려면 정말) 테이블 구조

소개

$sql = "SELECT * FROM branches"; 

if($_SESSION['branchId']!==null){ 
    $sql.= " WHERE BranchCode='".mysqli_real_escape_string($con,$_SESSION['branchId'])."'"; 
} 

$result = mysqli_query($con,$sql); 
//Fetch rows as usual. 

참고 이미 다음, 당신의 테이블에 ID 열이있는 다음 부분을 무시 주시기합니다.

이제 테이블이 왜 그렇게 구성되어 있는지 잘 모르겠습니다. 대화 할 때 각 지점에 영숫자 전화 번호가있을 수 있습니다 (예 : 다른 지점을 호출 한 경우 "나는 지점 AW2011의 잭입니다 ...")하지만 SQL Injection은 진짜이며 가장 좋으며 가장 간단한 방법은 참조 변수를 유형 변환하여 추가 입력을 제거하는 것입니다. 그러나 문자열 열이 여전히 이스케이프되어야하므로 정수 유형 인 참조 열에만 유용합니다. 이를 염두에두고 브랜치 ID 주위에 mysqli_real_escape_string()을 사용했다는 것을 알게 될 것입니다. 왜냐하면 그것이 문자열 값이 될 것이라는 것을 알았 기 때문입니다.

많은 사람들이 Prepared Statements과 같은 것들을 추천하려고합니다. 내가 그것에 대한 링크를 제공했을 수도 있지만 때로는 매우 혼란 스러울 수 있으며, PHP의 PDO 연결에 대한 열렬한 팬이 아닙니다. MySQLi 확장은 또한 성명서 작성을위한 자체 버전을 제공합니다. 둘 다 복잡해 보입니다. 불필요하게 그렇게 느낍니다. 그러나 문자열 데이터를 사용해야하는 경우에는 SQL 삽입을 피할 수있는 가장 좋은 방법입니다.

테이블에 더 이상 참조가 없으면 데이터가 실제로 어떻게 보이는지 확신 할 수 없지만 사용자 정의 열이 있으면 사용자 이름 열을 전달하지 않습니다. 따라서, 나는 당신이 ID 컬럼을 가지기 위해 만드는 모든 테이블의 모든 레코드를 추천한다. 이 때문에 대신 길이 mysql_real_escape_string() 전화로, SQL 인젝션에 대해 경비 단순화, 나는 거의 모든 사용자가 SQL을 방지 할 필요가되어야한다는,

$sql .= 'WHERE branch_id='.(int)$_SESSION['branchId']; 

에 그리고 대부분의 경우에 if() 문에서 텍스트를 단축 할 수 주입. 만약 누군가가 당신의 세션 데이터를 변경하려고했다면 (시도는하지 않았지만 가능하다면) 입력을 시도한 여분의 텍스트가 삭제되거나 SQL이 부적절하게 실행될 수 있습니다. (그러나이 말을 인용하지 마십시오. 필자가 오래 전에 읽은 PHP 형변환 변수에 대해 읽은 것 때문에 완전히 잘못 될 수 있습니다).

ID 열의 의미와 사용 방법이 명확하지 않은 경우 다른 설명을하고 다른 사람에게 설명 할 수있는 것보다 훨씬 정확하게 설명해주십시오.

+0

거창한 생각과 잠재적 인 해결 방법에 대해 감사 드리며, 나는이 방법을 PHP를 통해 구현하는 방법을 살펴볼 것입니다. 아주 좋은 해결책입니다. – Palendrone

1

순수 SQL에서이를 수행하는 방법을 보여 주기만하면됩니다.

당신은 UNION을 수행 할 수 있습니다, 내부는

select b.BranchCode, b.BranchName, b.BranchAddress1, b.BranchAddress2 
from users u 
inner join branches b on u.BranchCode = b.BranchCode 
where u.UserName = '$_SESSION' 
and u.BranchCode is not null -- just for clarity, it's not neeeded 
union 
select b.BranchCode, b.BranchName, b.BranchAddress1, b.BranchAddress2 
from branches b 
CROSS JOIN users u 
where u.UserName = '$_SESSION[USERNAME]' 
and u.BranchCode is null 

SqlFiddle 참조 (이 경우 두 테이블 사이에 관계가 없다 같은) CROSS JOIN을 사용하여, 다른 가입하여 한 부분은 (필자는 사용자 이름을 추가 두 사용자, 즉 BranchCode가 NULL 인 사용자 두 명이 더 잘 이해할 수 있습니다.