2012-11-30 2 views
1

내 데이터베이스에 텍스트 (Products CodeProducts Variant)를 포함하는 열이 두 개 있습니다. 예를 들어PDO 두 개의 서로 다른 열에서 다른 배열의 두 값을 선택하는 방법

:
Products Code 다음과 같은 텍스트를 보유 : C050101, C070104

Products Variant은 다음 텍스트를 보유 : RED, 나는 모든 행 WHERE Code = Products Code AND Variant = Products Variant을 선택합니다

NULL을. 제가 위에서 쓴 예에
기지, 나는 2 행 얻을해야합니다 ... WHERE Code=C070104 and Variant IS NULL < <

내가 그것을 수행하는 방법 아무 생각이 NULL IS
첫 번째 행 WHERE Code=C050101 and Variant=RED
두 번째 행을
I 난 단지 내가 정말 당신의 도움을 주셔서 감사합니다 것

$arr = array('C050101','C070104'); 
$inclause = implode(',',array_fill(0,count($arr),'?')); 
$stockstmt = $pdo->prepare(sprintf("SELECT `id`, `WebTitle`, `StockCode` FROM `stock` WHERE `StockCode` IN(%s)",$inclause)); 
$stockstmt->execute($arr); 

에만 모든 행 WHERE Code = Products Code >>를 선택해야하는 경우 그것을하는 방법을 알고있다.
감사합니다.

+1

'Where where code in (테이블에서 Products 코드 선택)'과 같은 의미입니까? 귀하의 질문은 혼란 스럽습니다. – Kyle

+0

나는 뭔가가 작동하지 않는다고 말하지 않았다. 난 그냥 위의 ..보다 더 복잡한 쿼리를 사용하여 선택하고 싶습니다'WHERE (Code = "C050101"AND Variant = "RED") 또는 (Code = "C070104"AND Variant IS NULL)' – Ron

+0

글쎄, 그런 종류 당신의 대답은 바로 거기에 있습니다, 그렇지 않습니까?조회 할 두 필드를 추가하여 동적으로 조회를 생성하거나 두 필드에서 조인 할 임시 테이블을 작성하십시오. – MatsLindh

답변

2

IN=과 비교하는 방법 만 알고 NULL을 처리하기 위해 다르게 비교해야하기 때문에 IN 조건자를 사용할 수 없습니다.

MySQL에는 NULL = NULL이 true이고 NULL = 'RED'가 false라는 것을 알고있는 비표준 null-safe equal operator <=>이 있습니다.

MySQL 이외의 다른 것을 사용하는 경우 RDBMS는 유사한 술어에 대한 표준 SQL 구문 인 IS [NOT] DISTINCT을 지원할 수 있습니다.

$arr = array('C050101','RED', 'C070104', NULL); 

$sql = "SELECT `id`, `WebTitle`, `StockCode` FROM `stock` 
    WHERE (`StockCode`, `StockVariant`) <=> (?, ?) 
    OR (`StockCode`, `StockVariant`) <=> (?, ?)"; 

$stockstmt = $pdo->prepare($sql); 
if ($stockstmt === false) { die(print_r($pdo->errorInfo(), true)); } 

$status = $stockstmt->execute($arr); 
if ($status === false) { die(print_r($stockstmt->errorInfo(), true)); } 

당신이 술어의 목록을 작성하는 방법을 내가 당신에게 그것을 떠날거야 :

나는 다음과 작동 시험. 귀하의 코멘트를 다시


:

권장 연습이 없거나 적용 할 값을 나타내는 리터럴 문자열 'NULL'을 사용하지 않는 것. 이것이 SQL에서 NULL이되는 것입니다.

당신이 더 역동적 술어를 구축 할 수있게하는 기능을 원하는 경우,이 시도 :

function lookformultiplethings(array $arr) 
{ 
    global $pdo; 

    $where = array(); 
    $values = array(); 
    foreach ((array) $arr as $term) { 
    $where[] = '(' 
     . join(',', array_map(function ($col) {return "`$col`";}, array_keys($term))) 
     . ') <=> (' 
     . join(',', array_fill(0,count($term),'?')) 
     . ')'; 
    $values = array_merge($values, array_values($term)); 
    } 
    $sql = "SELECT `id`, `WebTitle`, `StockCode` FROM `stock` "; 
    if ($where) { 
    $sql .= "WHERE " . join(' OR ', $where); 
    } 

    $stockstmt = $pdo->prepare($sql); 
    if ($stockstmt === false) { die(print_r($pdo->errorInfo(), true)); } 

    $status = $stockstmt->execute($values); 
    if ($status === false) { die(print_r($stockstmt->errorInfo(), true)); } 

    print_r($stockstmt->fetchAll()); 
} 

lookformultiplethings(array(
    array('StockCode' => 'C050101', 'StockVariant' => 'RED'), 
    array('StockCode' => 'C070104', 'StockVariant' => 'NULL'), 
)); 

당신이 전달하는 배열의 키가 합법적 열 이름이 있음을주의하십시오. 즉, 실제 열의 화이트리스트에 대해 확인하지 않으면 사용자가 입력 한대로 열 이름을 설정하지 마십시오.

+0

내 NULL은 텍스트로 NULL입니다>'$ arr = array ('C050101', 'RED', 'C070104', 'NULL'); '여기에 좋은 해결책을주었습니다. 코드를 포함하고 모든 짝수 키에는 변형이 포함되며 형식으로 쿼리를 사용합니다. 그러나 당신의 솔루션은 역동적이지 않습니다. 단지 2 개의 코드와 2 개의 변형이 있다는 것을 기반으로하고 있습니다. 좀 더 역동적 인 것이 필요합니다. – Ron

관련 문제