2012-03-02 6 views
2

PHP에서 액세스하는 MySQL에 테이블이 있습니다. 다른 테이블PHP가 설치된 MySQL에서 완전히 임의의 정렬 순서

에 합류하기위한 INT - INT 기본 키

things.name - - VARCHAR

things.owner_ID

things.ID : 예를 들어, 테이블 이름 사항을 보자

내 선택 문이 나는 것처럼 보일 수 있습니다 필요한 것을 얻을 :

SELECT * FR OM 것들 어디서 owner_ID = 99;

아주 간단합니다. 이제는 사용자가이 쿼리에서 반환 된 항목에 대해 완전히 임의의 순서를 지정할 수 있기를 바랍니다. 목록이 표시되고 행 옆에있는 "위로"또는 "아래로"버튼을 클릭하여 목록 위 또는 아래로 이동하거나 드래그 앤 드롭 조작으로 다른 곳으로 이동할 수 있습니다. 나는이 주문을 데이터베이스 (동일 테이블 또는 다른 테이블)에 저장하고 싶습니다. 맞춤 주문은 각 owner_ID에 대한 행 집합에 대해 고유합니다.

나는이 주문을 행운없이 제공 할 수있는 방법을 모색했다. 나는이를 구현하지만, 나를 마지막 옵션을 작성하는 데 도움이되는 몇 가지 방법을 생각했습니다

  1. 가 INT 열을 추가하고 내가 내 순서로 반환 된 행을 얻을 필요가 무엇에 가치의 설정. 이는 행 단위로 검색하여 삽입 지점을 찾고, 앞뒤 행 정렬 열을 번으로 업데이트해야하는 문제를 나타냅니다.
  2. "다음"및 "이전"열이 있으면 연결된 목록을 구현할 수 있습니다. 내 자리를 찾으면 최대 행을 업데이트하여 행을 삽입해야합니다. 그러나 이것은 행 # 1에서 위치를 검색해야합니다. 이 밖에, 누가 알 수 있기 때문에
  3. 내가 모르고있어 일부 SQL/관계형 DB 트릭
  4. ...

나는 # 3에 대한 답을 찾고 있어요. 또한 데이터베이스에서 최대한 많은 작업을 수행하고 싶습니다.

답변

2

내가 읽은 바로는 각 사용자의 순서가 포함 된 새로운 표가 필요하다는 것을 말하면서 * user_orderings *라고합니다.

이 표에는 사용자 ID, 사물의 위치 및 사물의 ID가 포함되어야합니다. (user_id, thing_id)는 PK 여야합니다. 이렇게하면 매번이 테이블을 업데이트해야하지만 user_orderings 테이블에서 ORDER BY를 사용하고 things 테이블과 조인하려는 순서대로 사용자의 작업을 가져올 수 있습니다. 그것은 작동해야합니다.

+0

주문을 구현하기 위해 단순히 사물 테이블에 새 열을 포함시키는 것과 다른 점은 무엇입니까? – Steve

+2

여러 사용자가 있고 모든 사용자가 서로 다른 주문을 할 수 있음을 이해했습니다. 따라서 모든 사용자에 대해 새로운 항목이 필요합니다. 이 문제를 극복하려면 두 번째 테이블을 사용하십시오. 두 번째 테이블은'user- -order indentifier'-'item '을 함께 연결합니다 (Aldo가 설명한 것처럼). – apfelbox

+0

사용자 및 항목이 이미 원본 테이블에 연결되어 있습니다. 테이블에서 select를 수행하는 경우 "where user = id order by order_column"을 입력하십시오. 아마도 각 항목이 한 명의 사용자에게만 속하고 사용자는 항목 만 주문할 수 있습니다. – Steve

0

가장 간단한 순서 목록의 표현은 3,1,2,4입니다. 부모 테이블에이 문자열을 저장할 수 있습니다. 우리 테이블이 외래 키 profile_idphotos 인 경우 사진 번호는 profiles.photo_order입니다. 그런 다음 find_in_set() 함수를 사용하여 order by 절에서이 필드를 고려할 수 있습니다. 이 작업에는 두 개의 쿼리 또는 조인이 필요합니다.당신은 아마 싶지 않을 것이다

select photos.photo_id, photos.caption 
from photos 
    join profiles on profiles.profile_id = photos.profile_id 
where photos.profile_id = 1 
order by find_in_set(photos.photo_id, profiles.photo_order); 

참고로 인해 성능에 미치는 영향에 where 절에 find_in_set()을 사용하지만 order by 절에,이 있습니다 : 그래서 여기있다, 나는 두 개의 쿼리를 사용하지만 더 흥미 가입 이 결과를 얻기에 충분한 결과가 거의 없습니다.

이 정보는 사용자 시스템의 사용자 인터페이스가 사진 순서를 알아야하기 때문에 데이터베이스에서 쉽게 업데이트 할 수 있으며 데이터베이스에 주문이없는 경우 일부 기본값으로 되돌아갑니다. 따라서 인터페이스가 무엇이든간에 사용자가 변경하면 언제든지 주문을 서버에 보내야합니다.