2011-02-24 2 views
1

마다 고유 한 열이있는 행을 가져 오기위한 제 영어 execuse 시작,하지만 난 하나의 SQL 도움이 필요 :MySQL은 : 페이지

내가 예를 들어, 이벤트 테이블이 있습니다 ID, id_user, 서비스를, 타임 스탬프

그리고 (단 하나의 고유 한 id_user, 타임 스탬프와 두 번째 순서 될 것입니다 매 10 행에 예를 들어) 페이지에 하나 id_user 될 것입니다 순서를 가진 행을 얻을 필요


예 :

1, Pepa, Auto, 1.1.2011 
2, Pepa, Motorka, 1.1.2011 
3, Karel, Traktor, 2.1.2011 
4, Lukas, Jeep, 2.1.2011 
5, Pepa, Autokara, 3.1.2011 
6, Jindra, Traktor, 5.1.2011 

는 => 형명 도와

덕분에 간단한 "한 페이지에 고유 한 사용자의 이벤트"에서 (페이지 2 행)

**1. Page** 
1, Pepa, Auto, 1.1.2011 
3, Karel, Traktor, 2.1.2011 


**2. Page** 
2, Pepa, Motorka, 1.1.2011 
4, Lukas, Jeep, 2.1.2011 


**3. Page** 
5, Pepa, Autokara, 3.1.2011 
6, Jindra, Traktor, 5.1.2011 

!

+0

어떤 행을 어디로 가야할지 결정한 방법을 설명하는 의사 코드 알고리즘을 작성할 수 있습니까? 동일한 페이지에 사용자가 두 번 나타나지 않도록 데이터를 정렬하는 방법을 찾는 것이 계산 상으로 어려울 수 있습니다. 그것은 NP-Complete 인 배낭 문제와 같을 것입니다. – mellamokb

+0

많은 행이없는 경우를 처리해야합니까? 예를 들어, 예제에서 페이지에 5 개의 행을 표시하려면 어떻게 작동합니까? 총 6 개의 항목 만 있더라도 3 개의 Pepa 행이 있기 때문에 여전히 3 페이지가 있습니까? – jswolf19

답변

0

"그룹화"를 시도해 보셨습니까?

delimiter // 

connect pepa 

drop table if exists offers; 
create table offers (
id SERIAL, 
id_user VARCHAR(20) NOT NULL, 
offer VARCHAR(20) NOT NULL, 
timestamp TIMESTAMP DEFAULT NOW() 
); 

insert into offers 
(id_user,offer) 
values 
('Pepa', 'Auto'), 
('Pepa', 'Motorka'), 
('Karel', 'Traktor'), 
('Lukas', 'Jeep'), 
('Pepa', 'Autokara'), 
('Jindra', 'Traktor'); 

select * from offers group by id_user order by timestamp; 

// 

이 수율 다음 id_users 아무도이 반복되지 않도록

id id_user offer timestamp 
4 Lukas Jeep 2011-06-05 21:14:10 
6 Jindra Traktor 2011-06-05 21:14:10 
1 Pepa Auto 2011-06-05 21:14:10 
3 Karel Traktor 2011-06-05 21:14:10 

참고. 조건문 ("where")을 포함 시키면 로그인 한 사람의 id_user를 기반으로 고유 한 페이지를 만들 수 있습니다.

희망이 있습니다. :)

건배!

(타임 스탬프로 분류하는 것은. 여기에 조금 이상한 수 있습니다 그리고 당신은 항상 [등 PHP,] 당신의 선택의 언어 과정을 게시 할 수 있음을 잊지 않도록주의하십시오.)

+0

이 쿼리는 GROUP BY를 사용하지만 고유 한 행만 반환하지만 특정 ORDER (페이지 당 유일한 행) 인 모든 행이 필요했습니다. – frosty22

0

이 PHP 코드는 귀하가 귀하의 질문에 열거 한 것과 동일한 결과물을 만들어 낼 것입니다. 세계에서 가장 효율적인 것은 아니지만 일을 끝내게됩니다.

이렇게하려면 펑키 한 MySQL 쿼리를 작성할 수는 있지만 수천 개의 레코드 등이 얼마나 잘 확장되는지 모릅니다. 그리고 그 페이지를 생성하고 있습니다. :)

<?php 

// Collect stuff from the database 
$dbc=mysqli_connect('127.0.0.1','user','passwd','pepa') or 
die('Could not connect!'); 
$getOffers='select * from offers'; 
$rs=mysqli_query($dbc,$getOffers); 
while($thisRow=mysqli_fetch_assoc($rs)) 
$offers[]=$thisRow; 
mysqli_close($dbc); 

// Create the pages 
// (this is probably a bit over the top, but you get the idea) 
foreach($offers as $oI => $thisOffer) 
$offers[$oI]['used']=false; // <-- tell us if we've used the record or not 
$thisUser='Pepa'; // <-- the user who should appear at the top of each page 
$numRecsPerPage=2; // <-- the number of records per page 
$cPg=-1; foreach($offers as $oI => $thisOffer) { 
    if($thisOffer['id_user']==$thisUser) { 
     $cPg++; 
     $offers[$oI]['used']=true; 
     $page[$cPg][]=$thisOffer; 
     $recsUsed=1; foreach($offers as $pI => $procOffer) { 
      if(!$offers[$pI]['used'] && $offers[$pI]['id_user']!=$thisUser) { 
       $offers[$pI]['used']=true; 
       $page[$cPg][]=$procOffer; 
       $recsUsed++; 
      } 
      if ($recsUsed>=$numRecsPerPage) break; 
     } 
    } 
} 

// Print the pages 
foreach($page as $thisPage) { 
    foreach($thisPage as $thisRow) 
    echo $thisRow['id']."\t".$thisRow['id_user']."\t". 
      $thisRow['offer']."\t".$thisRow['timestamp']."\n"; 
    echo "\n"; 
} 

?> 

출력 : 다른 대답을 추가

1 Pepa Auto 2011-06-05 21:14:10 
3 Karel Traktor 2011-06-05 21:14:10 

2 Pepa Motorka 2011-06-05 21:14:10 
4 Lukas Jeep 2011-06-05 21:14:10 

5 Pepa Autokara 2011-06-05 21:14:10 
6 Jindra Traktor 2011-06-05 21:14:10 

죄송합니다 - 내가 그렇지 않으면 댓글을 추가 할 수 있지만 코드는 여기에 더 도움이된다 생각합니다.