2013-03-03 3 views
2

코드 :빈 테이블의 SELECT에 대해 mysql_num_rows가 1을 반환하는 이유는 무엇입니까?

$review = mysql_query("SELECT conceptID, MIN(nextReview) FROM userconcepts WHERE userID='$userID'"); 
$nrows = mysql_num_rows($review); 
echo "$nrows<br />\n"; 

테이블이 같은 항목이 올바른 열 값을 반환 할 때 쿼리가 작동합니다. 그러나 테이블이 비어있을 때, 지금 당장 HeidiSQL에서 확인할 수 있듯이, mysql_num_rows는 여전히 1을 반환하지만, 컬럼 값은 비어 있습니다. (테이블에 다른 사용자 아이디에 다른 값이있는 경우에도 문제가 계속 발생합니다.)

정상적인 작업 중에이 쿼리가 빈 세트를 반환하기를 기대하며, 결과의 존재에 따라 조치를 취하고 싶지만 그 결과가있는 경우 결과를 사용하려고합니다. 어떤 이유로이 코드가 제대로 작동하지 않는지 (테이블이 비어 있으면 0을 반환 할 것으로 기대됨)?

+0

[** 새 코드 **] (http://bit.ly/phpmsql)에 mysql_ * 함수를 사용하지 마십시오. 그들은 더 이상 유지되지 않으며 [공식적으로 사용되지 않습니다] (http://j.mp/XqV7Lp). [** 빨간색 상자 **] (http://j.mp/Te9zIL)를 참조하십시오. 대신 [* prepared statements *] (http://j.mp/T9hLWi)에 대해 알아보고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용하십시오. mysqli) - [이 기사] (http://j.mp/QEx8IB)는 어떤 결정을 내리는 데 도움이 될 것입니다. – Kermit

+1

@AarolamaBluenk 어떻게 사용자의 문제를 해결할 수 있을까요? – aaaaaa123456789

+2

@ aaaaaa123456789 그게 답이 아닌 이유입니다. – poke

답변

4

우선 쿼리는 매우 단순한 문제가 있습니다. conceptID 필드가 표시되지만 그룹화되지는 않습니다. 집계 함수를 사용하는 SELECT에 필드를 표시하려면이를 표시해야합니다. 그렇게하지 않으면 오류가 발생하며 많은 엔진이 쿼리를 실행하지 않게됩니다.

그 외에도 집계 함수가 있고 아무 것도 (즉, GROUP BY 절을 추가하지 않음) 그룹화하지 않으면 결과는 하나의 행입니다. 표의 행 수에 관계없이

+0

각 개념 ID의 최소값을 찾고 싶지 않습니다. 각 사용자 ID에 대해 최소값을 찾고 싶지 않습니다. 난 그냥 conceptID 및 고정 된 userID 최소 nextReview 행에서 nextReview 싶습니다. 이 오류에 대해 자세히 설명해 주시겠습니까? 사용할 적절한 코드는 무엇입니까? – user2129992

+0

게시 한 쿼리는 분명히 그렇게하는 쿼리가 아닙니다. 하나의 쿼리로 최소값을 가져와 nextReview가 해당 값인 conceptID를 찾기 위해 다른 쿼리를 사용해야합니다. 당신은 단일 쿼리에서 그렇게 할 수 있지만, 그것이 가치있는 것보다 더 많은 문제입니다. – aaaaaa123456789

+0

코드는 항목이있을 때 작동합니다. 검색을 두 번하는 이유는 무엇입니까? 그게 더 나아질 방법을 자세히 설명해 주시겠습니까? – user2129992

0

이유는 SQL 엔진이 집계 함수 만 사용하여 쿼리를 실행하면 하나의 행을 반환하기 때문입니다. 따라서 :

select count(*) 
from table 
where 1 = 2 

은 0 값을 가진 1 행을 반환 할 것입니다. 이것은 모든 SQL 엔진이 작동하는 방식입니다.

귀하의 쿼리는 약간 다릅니다 :

select conceptID, MIN(nextReview) 
FROM userconcepts 
WHERE userID='$userID'" 

대부분의 SQL 언어에서 그런이나 뭐 "절에 의해 conceptID없는 그룹"에서의 오류가 발생하는 것입니다. 즉, 쿼리에 구문 오류가 있습니다.

MySQL은 이것을 지원합니다. 최소 값 nextReview (where 조건을 만족하는 행)과 임의 값인 conceptID (동일한 행에서)을 리턴합니다. 이 경우 행이 없으므로 값은 NULL으로 설정됩니다.

아마도 하나의 행이 conceptId 개가 필요합니다. 그 쿼리는 다음과 같습니다 :

select conceptID, MIN(nextReview) 
FROM userconcepts 
WHERE userID='$userID' 
group by conceptId 
+0

고정 된 사용자 아이디를 가진 각 행에는 고유 개념 ID가 있습니다. 개념 ID별로 그룹화하는 것은 의미가 없습니다. – user2129992

관련 문제