2012-05-04 3 views
0

이상한 문제가 있습니다. 왜 작동하지 않는지 전혀 알지 못합니다. 내가 만들어 다음 쿼리가 :이 쿼리는 몇 주 전에 잘 작동했다MySQL 쿼리가 작동하기 전에, 지금은 그렇지 않습니까?

SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, ROUND(AVG(reviews.average) , 0) AS review 
FROM servers 
INNER JOIN reviews ON servers.id = reviews.server 
ORDER BY servers.score DESC 

합니다. "서버"테이블에서 많은 필드를 가져오고, "리뷰"테이블의 평균 필드가 "리뷰"테이블의 서버가 "서버"테이블의 ID와 동일한 것을 의미합니다.

내가 말했듯이이 쿼리는 이전에 문제없이 작동했습니다. 어제는 사이트의 중요한 부분이 작동하지 않는 것으로 나타났습니다.이 쿼리가 실패했다는 것을 알았습니다.

"서버"테이블에 4 개의 항목이 있으므로 정확히 1 행을 반환하는 것으로 확인되었습니다. 이것은 실행시 phpMyAdmin이 제공하는 것입니다 그 쿼리 :

id name address port up down genre score version country review 
NULL NULL NULL  NULL NULL NULL NULL NULL NULL NULL  NULL 

아무도 나를 계몽 수 있습니까? 내가 막혀 있기 때문에 최후의 수단으로 이곳에 왔습니다.

+0

당신은 테이블을 확인했다? 어쩌면 백엔드에서 잘못된 점이있을 수 있습니다. (내 조언은 테이블이 여전히 있는지 확인하기 위해 워크 벤치를 사용합니다) –

+1

'select * from servers' 쿼리를 수행하여 데이터가 누락되었는지 확인할 수 있습니다. SQL 주입 공격의 희생자가되었을 수 있습니다. –

+0

나는 누락 된 데이터가 없다는 것을 100 % 확신하고 있으며, 나는 SQL 인젝션의 모든 기회를 제거했다 (나는 사용자 입력을 깨끗하게하고 준비된 문장을 사용한다). 'SELECT * FROM servers'는 예상되는 행 수를 제공하는 반면이 쿼리는 모든 필드가 NULL 인 1을 제공합니다. – fruitcup

답변

2

설명에서 언급 한 것처럼 INNER JOINLEFT OUTER JOIN으로 변경하면 검토 테이블에 일치하는 행이 있는지 여부에 관계없이 서버를 반환합니다. 또한 스키마를 게시하지 않았지만 리뷰 테이블의 reviews.server 열을 다시 확인하면 server_id 일 수 있습니다. 또 다른 문제는, 당신은 그룹화 계산 인 AVG을하고있다,하지만 당신은 더 GROUP BY 조항이 없기 때문에 전체 쿼리가 같아야 그래서 나는 그것을 추가 제안 : functions BY GROUP에 대한

SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, ROUND(AVG(reviews.average) , 0) AS review 
FROM servers 
LEFT OUTER JOIN reviews ON servers.id = reviews.server # might be reviews.server_id 
GROUP BY reviews.server 
ORDER BY servers.score DESC 

더 많은 정보를 원하시면.

- 업데이트 -

SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, IFNULL(ROUND(AVG(reviews.average)), 0) AS review 
FROM servers 
LEFT OUTER JOIN reviews ON servers.id = reviews.server 
GROUP BY servers.id 
ORDER BY servers.score DESC 
+0

감사합니다. 이제 예상대로 작동합니다. 나는 이제 약간의 조사를해야 할 것입니다. 다시 한 번 감사드립니다! – fruitcup

+0

다행입니다. 행운을 빕니다. –

+0

안녕하세요, 마이크, 슬프게도이 솔루션에 문제가있어 다시 방문했습니다. 테스트 시나리오에서는 "서버"테이블에 2 개의 행이 있고 "리뷰"테이블에는 0 개의 행이 있습니다. 이 쿼리를 사용하면 서버 테이블에서 1 개의 결과 만 얻습니다. 왜, 정확히는 모르겠다. 나를 도울 수 있니? – fruitcup

관련 문제