2013-08-17 4 views
0

처음에는 newbee 질문에 사과드립니다. 저는 MySQL을 처음 접했습니다.ORDER BY 문제 GROUP BY 및 JOIN

등록 :

나는 간단한 사진 콘테스트 3 개 테이블이

ID 
UserName 
name 
LastName 
Email 
Mobile 

포토 갤러리 :

ID 
ImageName 
user_id 
Status=1 

photovote : 내가 계산해야

Photo_ID 
Date 
Time 
Status 

fo에 투표하다 각 사진을 타임 슬라이스에 표시하고 넥타이의 경우 마지막 투표를 먼저받은 사람을 확인해야합니다.

내가 함께했다 쿼리는 다음과 같습니다

SELECT  v.Photo_ID AS "Photo ID", 
     g.ImageName AS "Photo URL", 
     r.UserName AS "Username", 
     r.name AS "Name", 
     r.LastName AS "Surname", 
     r.Email AS "E-Mail", 
     r.Mobile AS "Phone", 
     v.Date AS "Last Vote Date", 
     v.Time AS "Last Vote Time", 
     COUNT(Photo_ID) AS "Total Votes" 
FROM photovote v 
    INNER JOIN photogallery g ON v.Photo_ID = g.ID 
     INNER JOIN registration r ON g.user_id = r.ID 

WHERE v.Status =1 
AND g.Status =1 

AND v.Date >20130728 
AND v.Date <20130805 

GROUP BY 1 

ORDER BY 10 DESC, 8 DESC, 9 DESC 

는 그럼에도 불구하고 ORDER BY가 제대로 작동하지 않습니다. 어떤 힌트라도 높게 평가됩니다.

덕분에, 안드레아

+1

"올바르게 작동하지 않는다"는 것은 무엇을 의미합니까? –

+0

주문 별 주문은 숫자가 아닌 열 이름이어야합니까? –

+0

@DavidMacCrimmon 디버깅 할 때 'order by'에서 위치 필드를 사용하는 것이 더 빠르지 만 생산을하기 전에 제거해야합니다. – vol7ron

답변

0

-

GROUP BY v.Photo_id, `Last Vote Date`,`Last Vote Time` 

(하지만 그건 별개의 문제이다 어떤 다른 변화 시간에 (예를 들어, 이름) 다음이 나중에 문제가 발생할 수있는 경우가) :

에 의해 그룹에 이러한 추가 나는 주어진 시간 조각에 각 사진을위한 투표를 셀 필요가 있고, 동점의 경우에 나는 마지막 투표를 첫째로받은 것을 검사 할 필요가있다.

그냥 투표와 lastVote 시간으로 분류 photo_ids를 얻을 수 있습니다 :

select Photo_ID, count(*) as votes, max(Timestamp(Date,Time)) as lastVoteTime 
from photovote 
where Date > [start] and Date < [end] and status = 1 
group by Photo_ID 
order by votes desc, lastVoteTime asc; 

당신이 원하는 결과를 얻기 위해 다른 테이블이 쿼리의 결과를 가입 할 수 있습니다.

+0

고마워요, 이것이 완벽하게 작동합니다! –

+1

' "총 투표", "사진 URL"있는 그대로 g.ImageName로 "사진 ID", \t 수 (v.Photo_ID) AS v.Photo_ID을 선택 다음과 같이 결과 전체 쿼리를 걱정하는 사람들을 위해 입니다 r.UserName r.name "이름"있는 그대로 "사용자 이름", "성"있는 그대로 r.LastName, "전자 메일"AS r.Email, "전화"있는 그대로 r.Mobile, \t \t 최대 AS (타임 스탬프 (v.Date, v.Time)) "마지막 투표 시간"으로 "총 투표 수"로 COUNT (Photo_ID) 포토 북에서 INNER JOIN 포토 갤러리 g ON v.Photo_ID = g.ID INNER JOIN 등록 r ON g.user_i D = r.ID WHERE v.Status = 1 AND g.Status = 1 AND v.Date> 20,130,728 AND v.Date <20,130,805 GROUP 1 ORDER BY DESC 10, 9' –

1

이 하나에 의해 주문을 바꾸기 : 당신은 ""(공백) 문자로 인해 백 진드기를 사용할 필요가

ORDER BY `Last Vote Time` DESC, `Last Vote Date` DESC, `Total Votes` DESC; 

. 또한 ORDER BY의 순서가 차이를 만듭니다.

또한 GROUP BY에 더 많은 필드를 포함해야합니다. 그렇지 않으면 MYSQL에서 데이터가 손실됩니다 (다른 DBMS는 쿼리를 유효하지 않게 만듭니다).

+0

작동하지 않습니다. 내가 얻는 것은 마지막 사진이 아니라 각 사진에 대한 첫 번째 투표입니다. 이상한 점은, 마지막 2 DESC를 제거하면 날짜/시간 정렬에만 영향을 미친다는 것입니다. 대신 정확히 동일한 순서로 정확한 값을 표시합니다. –

+0

@AndreaCorelli 내 업데이트를 확인하십시오 - 그것은 주문에 관한 것입니다 - 또한 실제로 필요한 것에 따라 ASC와 장난감. –

+0

귀하의 변경 사항에 따라, 그것이 정확하다는 것을 이해하면 마지막 날짜의 최근 의견과 총 투표 수별로 정렬 된 데이터가 표시되어야합니다. 이것은 실제로 일어나지 않습니다. 요점은 그룹화 전에 날짜와 시간을 기준으로 정렬을 수행해야한다는 것입니다. 어쩌면 쿼리가 완전히 잘못되었을 수도 있습니다. –