2013-03-11 2 views
1

'events'테이블과 'photos'테이블이 있습니다. 각 이벤트에는 '사진'테이블에 해당하는 0 개 또는 여러 개의 레코드가있을 수 있습니다. 다음 sql은 각 이벤트에 대해 별도의 결과를 제공합니다.많은 레코드를 두 번째 mysql 테이블의 각 결과로 집계합니다.

각 이벤트가 고유 한 이벤트이고 사진이 PHP의 $ event [ 'photos']와 같은 항목에서 액세스 할 수 있도록 사진을 이벤트의 단일 필드에 집계하려면 어떻게해야합니까?

SELECT e.title, e.eid, p.pid 
FROM events e 
RIGHT JOIN photos p ON p.aeid = e.eid 
WHERE e.dateTimeStart >= $start_date_time AND e.dateTimeStart <= $end_date_time 
+1

나는 당신이 당신의 결과 세트에서 반복 할 필요가 있다고 생각한다. 그러나 당신은 그것을 조정할 수있다. 그러나 그것은 PHP에서 출력 결과를 처리함으로써 이루어져야한다. – Snivs

+0

버머, 내가 프로덕션에서 가지고있는 것이지만 많은 이벤트 레코드로 인해 느려지고있다. 편집 : 글쎄, 나는 각 이벤트에 대해 별도의 사진 쿼리를하고있다. 이 출력을 처리하는 것이 속도가 빠르다는 것을 알게 될 것입니다. (비록 모두 SQL을 사용하고 싶습니다) – celwell

+0

성능을 향상시키고 싶다면 (aeid DESC, PID ASC와 같은) 사진에 인덱스를 추가해보십시오. 이렇게하면 사진에 대한 검색 속도가 빨라집니다. – Snivs

답변

2

당신이 MySQL을 사용하고 있기 때문에, 당신은 GROUP_CONCAT 집계 함수를 사용할 수있는 옵션이 있습니다

SELECT e.title, e.eid, GROUP_CONCAT(p.pid) AS pids 
FROM events e 
LEFT JOIN photos p ON p.aeid = e.eid 
WHERE e.dateTimeStart >= $start_date_time AND e.dateTimeStart <= $end_date_time 
GROUP BY e.title, e.eid 

그러나, 하나의 열에서 여러 값을 저장하는 제 1 정규형을 위반 기억 ... 따라서 GROUP_CONCAT 기능을 사용하기 전에 다른 문제와 비교해보십시오. 데이터를이 형식으로 저장하십시오.

또한, 단지 미적 이유로 바람직하지 않은 LEFT JOIN에 변경된 RIGHT JOIN가 ..., 나는 그것이 필요한 행이 events 때문에 원하는 기능이다 생각하고 photoszero to many 될 수 있습니다.

관련 문제