2016-08-19 5 views
0

데이터베이스에 두 개의 테이블이 있습니다. 그 중 하나는 만들 수있는 '건물'목록입니다. 다른 하나는 사용자가 만든 건물 목록입니다.한 테이블에서 다른 테이블에없는 행을 어떻게 표시합니까?

한 페이지 (cityproduction.php)에는 빌드 할 수있는 '건물'목록이 표시됩니다. 빌드 할 수있는 건물, 아직 만들지 않은 건물을 표시하고 싶습니다. 여기

내 코드입니다 :

$sql = "SELECT * FROM [The list of built buildings] WHERE building_owner = '$user'"; 
$result = $conn->query($sql); 

if ($result->num_rows > 0) { 
while($row = $result->fetch_assoc()) { 
    $variable = $row["building_name"];  
} 

(...)

$sql = "SELECT * FROM [The list of ALL buildings] WHERE name != '$variable' ORDER BY id asc"; 
$result = mysqli_query($database,$sql) or die(mysqli_error($database)); 

while($rws = mysqli_fetch_array($result)){ 
echo $rws["name"]; (etc.) 

이것이하고있는 것은 단지 모든 사용자가 구축하고 건물 중 하나를하지-표시되지 그들.

답변

0

첫 번째 쿼리 이후에 while을 사용하는 이유는 무엇입니까? 목록 또는 단일 값으로 간주되는 이유는 무엇입니까? 당신이 당신의 두 번째 쿼리에 $variable를 사용하는 경우에만 목록의 마지막 값의 값을가집니다 때문에

if ($result->num_rows > 0) { 

    $variable = array(); 

    while($row = $result->fetch_assoc()) { 

    $variable[] = $row["building_name"];  
} 

두 번째 쿼리 예를

지고있다 : 실제 테이블 이름을 보지 않고

foreach($variable as $building) { 

     $sql = "SELECT * FROM [The list of ALL buildings] WHERE name != '$building' ORDER BY id asc"; 
     $result = mysqli_query($database,$sql) or die(mysqli_error($database)); 
     $result = mysqli_fetch_assoc($result); 

     echo $result["name"]; 
    } 
+0

$ 변수가 al 이길 원합니다. 해당 사용자가 작성한 모든 건물 중 일부입니다. 방금 배열로 저장한다고 가정했는데, 어떻게 배열로 저장할 수 있습니까? – Daniel

+0

'while' 앞에'$ variable = array();'와'while' 안에'$ variable [] = $ row [ 'building_name'];'을 사용하지만 두 번째 쿼리는 루프에 있어야합니다 배열의 각 값으로 질의를 할 수 있습니다.이 경우에는 'foreach' 루프가 될 수 있습니다. –

+0

@DanterNetwork 그런 문자열에 배열을 사용할 수 없습니다. 당신은 CSV를 구축하고 그것을'in' SQL에 전달할 수 있습니다. 이것은 두 번째 레벨 SQL 인젝션을 열 것이다. – chris85

1

또는 스키마를 정확하게 대답하는 것은 까다로운 일이지만 다음 행을 따라 뭔가를 시도해 볼 수 있습니다.

SELECT * FROM `all_buildings` 
WHERE `id` not in ( 
    select `building_id` from `built_buildings` where `building_owner` = '$user' 
    ) 
ORDER BY `id` asc; 
+0

감사합니다! 나는 '존재하지 않는다'는 생각을하지 못했습니다. 어리석은 저요. – Daniel

0

두 테이블 모두 관련 ID 유형 열이 있다고 가정합니다. 그들이 쿼리 :

SELECT building_name, building_owner FROM 
    test.all_buildings a 
    LEFT JOIN test.built_buildings b ON a.id = b.building_id AND b.building_owner = ? 
ORDER BY building_owner DESC, building_name; 

(? 사용자입니다), 당신은 하나 개의 쿼리에서하지 않은 사람 다음에 건설 된 모든 건물, 먼저 사람을 선택할 수 있습니다. 테이블에 ID가없는 경우 대신 이름에 연결할 수 있습니다. 이름이 뚜렷한 한 그것은 효과가 있어야합니다.

행을 가져올 때 행에 building_owner이 있는지 확인하여 "내장"또는 "내장되지 않음"으로 정렬 할 수 있습니다.

if ($result->num_rows > 0) { 
    while($row = $result->fetch_assoc()) { 
     if ($row['building_owner']) { 
      $built[] = $row['building_name']; 
     } else { 
      $not_built = $row['building_name']; 
     } 
    } 
} 
1

SQL에 대한 질문의 또 다른 번역 상관 하위 쿼리의 결과 (NOT IN 외에) :

NOT IN을 통해 가장 큰 장점
SELECT * FROM `all_buildings` AS a 
WHERE NOT EXISTS 
    ( 
    select * from `built_buildings` AS b 
    where a.`id` = b.`building_id` -- Outer Select correlated to Inner 
     and b.`building_owner` = '$user' 
) 
ORDER BY `id` asc; 

: 그것은 단지 두 개의 값 로직 (NULL를 사용하고는 무시됩니다 = false) NOT IN은 3 값 논리를 사용하는 반면 (NULL에 대한 비교는 을 알 수 없음.은 예상 한 값을 반환하지 않을 수 있습니다.)

관련 문제