2016-08-15 3 views
1

난 당신이 다음과 같은 배열을 얻을 그 값 중 하나를를 unserialize하면 followinng쿼리 직렬화 된 데이터

umeta_id | user_id | meta_key | meta_value 
433369 | 44  | all_contests | a:1:{s:12:"all_contests";a:2:{i:5011;a:1:{s:7:"entries";i:3;}i:8722;a:1:{s:7:"entries";i:3;}}} 
433368 | 63  | all_contests | a:1:{s:12:"all_contests";a:2:{i:5032;a:1:{s:7:"entries";i:3;}i:8724;a:1:{s:7:"entries";i:3;}}} 

과 같이 SQL 데이터의 행이 1000 주어진 컨테스트 ID에 대해 모든 사용자 중에서 리더 보드를 만들려고합니다. "all_contests"키는 사용자가 등록한 모든 컨테스트 ID로 구성된 배열을 보유합니다. 그 안에는 해당 콘테스트에 대한 항목이 있습니다.

쿼리는 'all_contests'키가 포함 된 모든 행을보고 주어진 컨테스트 ID에 대해 10 개의 가장 높은 항목 값을 찾아야합니다.

직렬 데이터의 내부를 신뢰할 수있는 방식으로 검색 할 수 있는지조차 확신하지 못합니다.

+1

오, 소년. 이는 직렬화 된 배열로 데이터를 저장하는 것이 SQL 쿼리에서 불가능한 데이터를 USING으로 만드는 것을 완벽하게 보여줍니다. – RiggsFolly

+0

관심있는 행을 선택하고 PHP에서 데이터를 unserialize()하여 해당 데이터를 정리해야합니다. 각 행에 대해 수행하려는 작업은 아마도 필요한 데이터를 얻기 위해 처리 할 수있는 또 다른 데이터 배열을 구축 할 것입니다. – RiggsFolly

답변

1

아니요, 직렬화 된 데이터 내에서 검색하는 것은 비현실적입니다.

INSTR(), SUBSTR(), FIELD() 등과 같이 충분히 세심한 사용으로 수행 할 수 있습니다. 그런 쿼리를 작성하는 것은 쿼리를 개발하는 데 많은 시간이 소요되며 성능이 좋지 않습니다.

일반적인 실수에 대한 변형입니다. 한 테이블의 열에 쉼표로 구분 된 목록을 저장하는 것입니다.

이렇게하면 다 대다 관계를 나타내는 교차 테이블이 작성되지 않습니다. 즉, 사용자와 컨테스트에 대한 두 개의 표가 있고 각 행이 하나의 컨테스트에 한 명의 사용자가 참여하는 세 번째 표가 필요합니다.

내 대답보기 Is storing a delimited list in a database column really that bad? 답변은 쉼표로 구분 된 목록에 대한 내용이지만 동일한 방식으로 일련 번호가 지정된 배열에도 동일하게 적용됩니다.

+0

Bill fyi http://stackoverflow.com/q/38998297 핑 (ping)에 대해 사과하십시오 : – Drew

+0

입력 해 주셔서 감사합니다. , 나는 나의 모델을 조정할 것이다. –

관련 문제