2011-10-07 5 views
2

이것이 작동하지 않는 이유를 알 수 없습니다. 기본적으로 하위 쿼리를 실행하여 p.songid WHERE trackDeleted=0의 모든 행을 계산합니다. 하위 쿼리는 자체적으로 실행할 때 잘 작동하지만 구현할 때 "하위 쿼리는 둘 이상의 행을 반환했습니다."라는 메시지가 나타납니다.MySQL 하위 쿼리가 두 개 이상의 행을 반환했습니다.

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, 
(SELECT COUNT(p.songid) 
FROM songs s 
LEFT JOIN users u 
ON u.id = s.userid 
LEFT JOIN posttracks p 
ON s.songid = p.songid 
WHERE p.trackDeleted=0 
GROUP BY s.timeSubmitted ASC 
LIMIT 25) 
AS trackCount 
FROM songs s 
LEFT JOIN users u 
ON u.id = s.userid 
LEFT JOIN posttracks p 
ON s.songid = p.songid 
WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
GROUP BY s.timeSubmitted ASC 
LIMIT 25 

답변

2

분명히 하위 쿼리는 두 개 이상의 행을 반환 할 수 없습니다. 하나의 값, 즉 COUNT(p.songid)이 반환되기를 기대할 수 있습니다. GROUP BY s.timeSubmitted을 사용하면 여러 행을 반환하게되고 p.songid은 여러 번 계산됩니다.

+0

나는 본질적으로 deletedTrack = 0 인 모든 트랙의 트랙 개수로 새로운 컬럼을 생성하려고합니다. 어떻게 내가 이것에 대해 갈 것이냐? – user978905

+0

하위 쿼리 –

+0

에서 GROUP BY 및 LIMIT 절을 제거하면 각 행에 동일한 값이 반환됩니다. 각 songid에 대해 tracksDeleted = 0 인 행 수를 반환 할 수 있어야합니다. – user978905

0

이렇게하면 SELECT 목록의 하위 쿼리는 선택 목록의 다른 열과 같이 작동하기 때문에 단일 값을 반환해야 할 필요가 있습니다. LIMIT 25을 가지고 있기 때문에 분명히 하나 이상의 값을 기대할 수 있습니다. 이는이 용도에 맞지 않습니다.

+0

나는 본질적으로 deletedTrack = 0 인 모든 트랙의 트랙 수로 새로운 열을 만들려고합니다. 어떻게 내가 이것에 대해 갈 것이냐? – user978905

0

OK, 쿼리가 엉망입니다. 하위 쿼리가 손상되었을뿐만 아니라 GROUP BY s.timeSubmitted ASC이 생각하는대로 작동하지 않는다고 확신합니다. (대신 ORDER BY을 의미 했습니까?) 달성하려고하는 단어를 설명하면 도움이 될 수 있습니다. 어쨌든

, 내가 추측 걸릴 것와 당신이 원하는 것을 할 수 있음을 시사하고 있습니다 :

SELECT 
    u.username, u.id, u.score, s.genre, s.songid, s.songTitle, 
    s.timeSubmitted, s.userid, s.insWanted, s.bounty, 
    COUNT(p.songid) AS trackCount 
FROM songs s 
    LEFT JOIN users u ON u.id = s.userid 
    LEFT JOIN posttracks p ON p.songid = s.songid AND p.trackDeleted = 0 
WHERE paid = 1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
GROUP BY s.songid 
ORDER BY s.timeSubmitted ASC 
LIMIT 25 

편집 : 더있을 경우 제대로 0을 반환하지 않습니다되도록 COUNT() 해결 일치하는 트랙.

관련 문제