2010-12-13 6 views
3

현재 작업중인 웹 사이트의 photoalbum 페이지를 개발하고 있으며, 내 생각은 모든 photoalbum에 대한 개요를 작성하여 가장 최근에 추가 된 5 개의 사진 . photoalbum은 두 개의 MySQL 테이블을 사용합니다. 하나는 앨범 세부 정보 (예 : 앨범 이름, 앨범 ID)와 사진이 들어있는 테이블 (blob로 데이터베이스에 저장)과 해당 앨범 ID입니다.앨범 및 앨범 세부 정보에서 처음 # 행을 선택하는 방법

그러나 나는 앨범의 모든 세부 사항과 앨범에 해당하는 5 개의 가장 최근 사진에 대한 ID를 가져올 수있는 쿼리를 찾을 수 없었습니다. 네가 나를 좀 도와 주길 바래.

는 다음과 같다 :

테이블 : photoalbums

id | album_name | album_created 
------------------------------------- 
1 | testalbum | 2010-11-07 19:33:20 
2 | some more | 2010-11-15 18:48:29 

테이블 : 나는 하위 쿼리를 필요로하는 것, 또는 수행하는 것 같은 그것은 나에게 보이는 사진

id | file | thumbnail | name | album_id 
------------------------------------------ 
1 | binary | binary | test1 | 1 
2 | binary | binary | test2 | 1 
3 | binary | binary | test3 | 2 
4 | binary | binary | test4 | 2 
5 | binary | binary | test5 | 1 

앨범 당 별도의 검색어. 차라리 여러 개의 쿼리를 사용하지 않는 것이 좋습니다.

아무에게도이 작업을 수행하는 올바른 방법을 찾는데 도움이 될 수 있습니까? 미리 감사드립니다.

+0

모든 앨범과 각각의 최신 앨범 5 장 각각의 목록을 자주 원하십니까? 특정 앨범에 가장 최근에 찍은 5 개의 사진을 원할 때가 많을 것 같습니다. – zanlok

답변

0

앨범 ID를 포함, 당신은 어떤 새로운 사진이 삽입되어 동시에 삽입되는 별도의 드 정규화, '역사'테이블을 생성하는 것이 좋습니다

SELECT * FROM pictures LEFT JOIN photoalbums ON (photoalbums.id=pictures.id) ORDER BY album_created DESC 
LIMIT 5 
+0

이것은 각 앨범에 대해 5 개의 가장 최근 사진을 반환하지 않으며, * 앨범 * 생성으로 주문한 가장 최근의 사진 5 장만 반환합니다. – zanlok

+0

사진에는 날짜가 없습니다! – Thariama

1

시도 날짜 사진이 삽입되었으며이 열 테이블에 표시 할 수있는 열이 표시됩니다. 그런 다음 photo_creation_date을 기반으로이 표를 선택할 수 있습니다. 앨범 작성 날짜가 여기에 도움이 될 것이라고 생각하지 않습니다.

이렇게하면 사진 생성 날짜를 기반으로 실행하는 검색어를 다른 삽입/업데이트/읽기 작업이 사진 생성 날짜와 관련이없는 사진 및 앨범에 대해 수행됩니다. I.E. 사진 앨범과 그림 테이블에 추가 색인을 저장합니다.

이렇게하면 추가 저장 및 삽입 작업이 필요하지만 읽기 속도가 빨라집니다. 또한 히스토리 테이블 유지 보수시주의해야합니다. 사진 및 photoalbum 테이블의 삭제/업데이트/삽입은 기록 테이블을 업데이트해야합니다.

0

그것은 단지 하나 개의 특정 앨범에 대한 정보, 그리고 당신이 pictures 테이블에 열 수정 날짜를 추가 할 경우,이 같은 것을 할 수있는 경우 : 5 가장 최근의 사진 수정 목록은

SELECT a.*, p.* 
FROM photoalbums AS a 
LEFT JOIN pictures AS p ON a.id = p.album_id 
WHERE a.id = 1 -- (insert number here) 
ORDER BY p.modified_date 
LIMIT 5 

을 모든 앨범에서 네, 그 정보를 반환하는 쿼리를 만드는 방법이 있습니다. 나에게 알려줘. 나는 너에게 그런 질문을 할거야.

0

커서 (qv http://dev.mysql.com/doc/refman/5.0/en/cursors.html) 또는 임시 (심지어 영구적 인, Macy가 제안한) 테이블을 사용하여 질문 할 수 있다고 생각하지만 실제로 좋은 이유가 있는지 스스로에게 물어야합니다 4 줄 또는 5 줄의 PHP가 원하는대로 할 수있는 길이로 가려면 작고 더 단순한 여러 쿼리를 사용해야합니다.

너는 키스를 기억하고 네 마음에 거룩하게 지켜라.

+0

임시 테이블을 생각하고 있습니다. 또는 서브 쿼리 속임수로 제한됩니다. 그러나 우리는 ** 동의했습니다 ** - PHP에서 루프를 사용하여 앨범 당 반복되는 LIMIT 5 쿼리를 반복하면 완료됩니다. – zanlok

0

이 쿼리는 모든 앨범 세부 정보와 ID로 정렬 된 모든 사진을 쉼표로 구분 된 필드로 내림차순으로 가져옵니다. 가장 높은 picture.id는 가장 최근의 사진입니다. 왜냐하면 사진에 date_inserted 열이 없기 때문입니다.

SELECT a.*, GROUP_CONCAT(p.id ORDER BY p.id DESC) as picID FROM photoalbums AS a INNER JOIN pictures AS p ON p.album_id=a.id GROUP BY p.album_id 

이렇게 말하면 모든 사진이 ID 순서가 감소합니다. PHP를 사용하면 쉼표로 쪼개서 처음 5 개의 ID를 분리하는 간단한 문제 여야합니다.

이 재미있는 작은 프로젝트에 감사드립니다.하지만 계속 진행해야하며 불행히도 SQL 쿼리를 사용하여 원하는 위치에 정확히 도달하지 못했습니다.

0

단일 단계에서이를 수행하려면 쿼리가 실행되는 동안 부모 필드와 어떤 방식으로 관련이 있어야합니다. 이렇게하려면 변수를 사용해야합니다. 여기서, 변수 x를 사용하여 쿼리가 실행될 때 현재 카운트를 유지합니다. 각 레코드가 선택 될 때 현재 레코드가 현재 상위 레코드에 속하는지 여부를 결정합니다. 이 경우 단순히 누적 합계에 0.5를 더합니다. (원래 1 번 시도했지만 1 번 두 번 추가 된 것 같습니다).

다음은 마지막 쿼리입니다. 도움이되는지 알려주세요. :-)

는 album_id, ID, @x를 선택 = album_id 이미지 FROM GROUP BY album_id = (@album_id = album_id, @x + 0.5, 1) CNT, 경우 @album_id , id, cnt HAVING cnt < = 5;